【问题标题】:unable setText() in JTextField from another JFrame无法从另一个 JFrame 中的 JTextField 中的 setText()
【发布时间】:2014-02-08 08:31:58
【问题描述】:

我有两个分别命名为 first 和 second 的 JFrame。两个框架都有 jtextfields 到 getText() 和 setText()。我可以从第一个到第二个 JFrame 设置文本,但无法从第二个到第一个设置文本。

在第一帧和第二帧中,我已经制作了所有 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;

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

【问题讨论】:

  • 但是你的两个类名都是name!! ?
  • 你在使用 netbeans 吗?
  • 是的。和类名是firstsecond

标签: java swing jframe


【解决方案1】:

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

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

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

Int 你的First 类只是这样创建它

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

【讨论】:

  • 什么是frame.getTextField(); 这是什么类型的方法。
  • 如果您阅读了完整的答案,您会注意到我说过要在 JFrame 类中创建该方法,这将返回您要更改的文本字段。
【解决方案2】:

如果您“不想再次打开第一帧”,那么您必须避免创建 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 方法。

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

【讨论】:

  • “我不会将文本字段设为公共静态,我宁愿提供 getter 方法。” public static 不是办法!
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多