Java 无法从另一个JFrame在JTextField中设置setText()

Java 无法从另一个JFrame在JTextField中设置setText(),java,swing,jframe,Java,Swing,Jframe,我有两个jframe,分别命名为first和second。两个框架都有用于getText()和settText()的jtextfields。我能够将文本从第一帧设置到第二帧,但无法将文本从第二帧设置到第一帧 在第一个和第二个框架中,我将所有JTextFieldspublicstatic first.java private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

我有两个jframe,分别命名为first和second。两个框架都有用于getText()和settText()的jtextfields。我能够将文本从第一帧设置到第二帧,但无法将文本从第二帧设置到第一帧

在第一个和第二个框架中,我将所有JTextFields
publicstatic

first.java

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    second sec = new second();  
    sec.jTextField1.setText(this.jTextField1.getText()); // this works
    sec.jTextField2.setText(this.jTextField2.getText()); 
    sec.setVisible(true);

    public static javax.swing.JTextField jTextField1;
    public static javax.swing.JTextField jTextField2;
    private javax.swing.JButton jButton1;
second.java

   private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
   first f = new first();
   f.jTextField1.setText(this.jTextField3.getText()); //not working
   f.jTextField2.setText(this.jTextField4.getText());
   }
   public static javax.swing.JTextField jTextField1;
   public static javax.swing.JTextField jTextField2;
   public static javax.swing.JTextField jTextField3;
   public static javax.swing.JTextField jTextField4;
   private javax.swing.JButton jButton1;

单击第二帧按钮,第一帧应得到更新。我不想再打开第一帧

在我开始之前,先看一下

“单击“第二帧”按钮后,第一帧应得到更新。我不想再次打开第一帧。”

它不起作用,因为您正在创建一个新的
JFrame
first
)。当然,它将打开一个新的框架。与其创建新框架,不如将同一框架作为参照传递

我将给出一个使用
JDialog
而不是
JFrame
的示例。如果在阅读上述链接后,您仍然认为
JFrame
是您想要的,那么相同的代码可以实现到
JFrame
中。它们基本上有相同的结构

所以我传递引用的基本意思是。将
JFrame
传递给
JDialog
的构造函数。这样,您传递给它的
JFrame
将与引用的
JFrame
相同

public class MyDialog extends JDialog {
    private First frame;
    private JTextField thisTextField;

    public MyDilaog(final First frame, boolean modal) {
        super(frame, modal);
        this.frame = frame;

        thisTextFiled = new JTextField(20);
    }
}
在你的
第一个
类中按如下方式创建

MyDialog dialog = new MyDialog(First.this, true);
现在您有了对框架的引用。您还需要
JFrame
类中的
getter
,它将从
JFrame
类访问
JTextField
。然后可以设置其文本,因为它也被引用。因此,您可以从
JDialog

public void actionPerformed(ActionEvent e) {
    String text = thisTextField.getText();

    JTextField fieldFromFrame = frame.getTextField();
    fieldFromFrame.setText(text):
}

此外,还需要使用Java命名约定。类名用大写字母表示。因此
First
而不是
First

如果您“不想再次打开第一帧”,则必须避免创建First的新实例,而是使用以前实例的引用

所以你需要一个推荐人。。。向第二个用户提供对第一个用户的引用的一种方法是在构造函数中提供它,如:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){                                         
  second sec = new second(this);  //notice I'm passing a reference to this as an argument second's contstructor   
  sec.jTextField1.setText(this.jTextField1.getText()); // this works
  sec.jTextField2.setText(this.jTextField2.getText()); 
  sec.setVisible(true);
然后,您需要将对first的引用存储在第二个类中,并使用它访问文本字段:

private first f;
public second(first referenceToFirst){
  this.f=referenceToFirst;
}
好的,然后使用f字段,而不是在单击第二个按钮时实例化新的第一个字段

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){                                         
  //first f = new first();  //don't instantiate a new first, use the one you got in the constructor
  f.jTextField1.setText(this.jTextField3.getText());
  f.jTextField2.setText(this.jTextField4.getText());
}
注:

我不会将文本字段公开为静态,我宁愿提供getter方法


我建议您遵守命名约定:类使用大写字母,变量使用有效名称。

尝试在第一个jframe中传递第二个jframe作为参数,而不是使用它来更改文本字段

,但两个类名都是name?你在使用netbeans吗?是的。类名是
first
second
什么是
frame.getTextField()
这是哪种类型的方法。如果您阅读了完整的答案,您会注意到我说过在JFrame类中创建该方法,它将返回您想要更改的文本字段。“我不会将textfields设置为公共静态,我宁愿提供getter方法。”
公共静态
不是这个方法!