4

我目前正在从事大学一年级的项目,我有一个问题,虽然我怀疑这是一个非常复杂的问题,但我一直在寻找,但我找不到合适的答案。

问题涉及两个类。一个gui类(class1)和另一个类(class2),当我运行代码时,第二个类在尝试从class1中检索class2中的getText()字符串时给了我一个nullpointerexception。

我在 class1 中有一个 JTextField 并试图将 .getText() 值传递给 class2 并将其存储在 String 类型变量中。

我试图实现这一点的当前代码如下(简化):

 public class Class1 {

    private JTextField textField = new JTextField("Something");

      public Class1() {}
    ...
    public String getTextFieldString() {
      return textField.getText();
  }
}

 public class Class2 {

   public Class2(Class1 class1) {
    c1=class1
   }
    private c1 Class1 = new Class1();
    private String s = new String();
    ...
    s = c1.getTextFieldString();
}

我对编码很陌生,我读过也许我需要在某个地方传递一个参数,我认为这是因为 textField 本身不是静态的,当有人输入新值时它会改变。(很抱歉在那里陈述显而易见的事情。)

无论如何,感谢您的帮助。非常感谢!

4

3 回答 3

4

我可能会帮助查看 Java 中规定的 初始化顺序。特别是,textField实例变量初始化程序应该在有效Class1实例存在时完成。违反此顺序的一种方法是在不同的线程上构造Class1和。Class2为了排除这种情况,Swing GUI 对象应该事件调度线程上构建和操作,如下面的sscce所示。

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/** @see http://stackoverflow.com/q/10067399/230513 */
public class NewJavaGUI extends JPanel {

    public NewJavaGUI() {
        Class1 class1 = new Class1();
        Class2 class2 = new Class2(class1);
        this.add(class1.textField);
        this.add(new JLabel(class2.s));
    }

    private static class Class1 extends Object {

        private final JTextField textField = new JTextField("Something");

        public Class1() {} // implicit

        public String getTextFieldString() {
            return textField.getText();
        }
    }

    private static class Class2 extends Object {

        private final Class1 c1;
        private final String s;

        public Class2(Class1 class1) {
            c1 = class1;
            s = c1.getTextFieldString();
        }
    }

    private void display() {
        JFrame f = new JFrame("NewJavaGUI");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new NewJavaGUI().display();
            }
        });
    }
}
于 2012-04-09T01:24:28.243 回答
3

好吧,您可以Class1在构造函数中传递一个引用Class2并将其保存在属性中,并且每次Class2需要文本时,只需调用getText()属性上的方法即可。

public class Class2 {
    private Class1 class1;
    public Class2(Class1 reference) {
        class1 = reference;
    }
    public void someMethod() {
        String s = class1.getTextFieldString();
    }
}

现在,当您实例化一个Class2对象时:

Class1 c1 = new Class1();
Class2 c2 = new Class2(c1);
于 2012-04-08T23:30:47.520 回答
2

听起来您很想知道何时有人修改了文本字段中的文本。我的第一条建议是,当您对 Swing 组件有特定问题时,请查看 Java 教程。具体来说,请查看JTextField 教程中的 addActionListener 方法,包括Text Demo示例。

于 2012-04-08T23:29:28.657 回答