来自另一个JFrame的JTextField中的setText()无法使用

时间:2014-02-08 08:31:58

标签: java swing jframe

我有两个分别名为first和second的JFrame。两个帧都有jtextfields到getText()和setText()。我能够从第一个到第二个JFrame setText,但是从第二个到第一个不能使用setText。

在第一帧和第二帧中,我制作了所有JTextField public static

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;
单击第二帧按钮第一帧

应该更新。我不想再打开第一帧。

3 个答案:

答案 0 :(得分:1)

在开始之前,请查看The Use of Multiple JFrames, Good/Bad Practice?`

  

“点击第二帧按钮第一帧应该更新。我不想再打开第一帧。”

由于您正在创建新的JFramefirst),因此无效。 当然它将打开一个新的框架。而不是创建一个新的框架,传递相同的框架作为参考。

我将使用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);
    }
}

在你的First课程中,只需像这样创建

MyDialog dialog = new MyDialog(First.this, true);

现在你有了对框架的引用。您还希望getter课程中的JFrame能够访问JTextField课程中的JFrame。然后您可以设置其文本,因为它也被引用。所以你可以从JDialog

做这样的事情
public void actionPerformed(ActionEvent e) {
    String text = thisTextField.getText();

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

此外,您需要使用Java命名约定。班级名称是大写字母。所以First不是first

答案 1 :(得分:0)

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

所以你需要一个引用......给你的第二个引用的第一种方法是在构造函数中提供它,如:

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);

然后,您需要将引用存储在第二个类中,并使用它来访问文本字段:

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());
}

注意:

我不会将textfields设为public static,我宁愿提供getter方法。

我建议您遵守命名约定:对类使用大写字母,并对变量使用重要名称。

答案 2 :(得分:0)

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