繁体   English   中英

无法从另一个JFrame在JTextField中使用setText()

[英]unable setText() in JTextField from another JFrame

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

在第一帧和第二帧中,我将所有JTextFields设为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;

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

在我开始之前,先看看“使用多个JFrame,良好/不良实践”。

“单击第二帧按钮时,第一帧应该会更新。我不想再次打开第一帧。”

它不起作用,因为您正在创建一个新的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);

现在,您可以参考框架。 你也想一getterJFrame将访问类JTextFieldJFrame类。 然后,您可以设置它的文本,也可以参考它。 因此,您可以从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中的参数传递,而不是使用它来更改文本字段

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM