我目前正在进行一年级的大学项目,我遇到了一个问题,虽然我怀疑这是一个非常复杂的问题,但我一直在寻找,但我找不到合适的答案。
问题涉及两个类。一个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本身不是静态的,当有人输入新值时它会改变。 (很抱歉在那里说明显而已。)
无论如何,感谢帮助。非常感谢!
答案 0 :(得分:4)
我可以帮助您查看Java中的prescribed initialization order。特别是,textField
实例变量初始值设定项应在有效Class1
实例存在时完成。违反此顺序的一种方法是在不同的线程上构造Class1
和Class2
。为排除这种情况,应在event dispatch thread上构建和操作仅 的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();
}
});
}
}
答案 1 :(得分:3)
好吧,你可以在Class1
的构造函数中传递Class2
的引用并将其保存在属性中,每次Class2
需要文本时,只需调用{{1}属性上的方法。
getText()
现在,当您实例化public class Class2 {
private Class1 class1;
public Class2(Class1 reference) {
class1 = reference;
}
public void someMethod() {
String s = class1.getTextFieldString();
}
}
对象时:
Class2
答案 2 :(得分:2)
听起来您有兴趣知道有人在文本字段中修改文本。我的第一条建议是,只要有关于Swing组件的特定问题,就可以查看java教程。具体来说,请查看JTextField tutorial中的addActionListener方法,包括Text Demo示例。