我不明白我的代码中发生了什么,当我触发带有附加动作侦听器的按钮时,读取JTextField getText()值显示为null,即使所有字段都包含文本。此外,当我调试代码并在此行之前停止时,JTextField对象也显示为null,就像它从未在第一时间初始化一样。
我不确定我是否可以将所有这些JLabel和JTextField保留为类成员,然后可以自由地阅读它们。
public class EditPartGUI extends JFrame {
private JLabel manufacturerLabel;
private JTextField manufacturerTextField;
private JButton submit;
private ActionListener submitListener;
public EditPartGUI(Part part) {
JPanel panel = new JPanel();
this.setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
panel.add(initialiseField("Manufacturer: ", manufacturerLabel, part.getManufacturer(), manufacturerTextField));
JPanel sub = new JPanel();
submit = new JButton("Submit");
submitListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(submit().toString());
}
};
submit.addActionListener(submitListener);
sub.add(submit);
panel.add(sub);
this.add(panel);
}
public JPanel initialiseField(String label, JLabel contentLabel, String value, JTextField contentTextField) {
JPanel contentPanel = new JPanel();
contentLabel = new JLabel(label, JLabel.TRAILING);
contentTextField = new JTextField(10);
contentTextField.setText(value);
contentLabel.setLabelFor(contentTextField);
contentPanel.add(contentLabel);
contentPanel.add(contentTextField);
return contentPanel;
}
public Part submit() {
Part p = new Part();
p.setManufacturer(this.manufacturerTextField.getText()); // <---- this is where NullPointerException shows
return p;
}
}
答案 0 :(得分:2)
我不确定我是否可以将所有这些JLabel和JTextField保留为类成员,然后可以自由地阅读它们。
是的,你可以,这就是你问题的解决方案。
时,请使用以下内容
//private JTextField manufacturerTextField;
private JTextField manufacturerTextField = new JTextField();
并且不要尝试在initialiseField()方法中创建文本字段。当然,你需要对标签做同样的事情。
所以我可以避免为每个字段重复相同的代码(在我的实际代码中有更多的代码)。
如果你想拥有包含这些字段的许多面板,那么你需要创建一个自定义类来创建面板,然后文本字段和标签将成为该类的一部分,而不是你的主类。
答案 1 :(得分:2)
问题是,假设方法initialiseField将参数contentTextField分配给manufactererTextField。正如David Wallace已经说过的那样,这在Java中不起作用。
如果要避免重复相同的代码,请尝试创建一个返回初始化TextField并在构造函数中指定它的方法。