JTextField已初始化但似乎为null

时间:2015-01-05 22:28:34

标签: java swing nullpointerexception

我不明白我的代码中发生了什么,当我触发带有附加动作侦听器的按钮时,读取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;
    }
}

2 个答案:

答案 0 :(得分:2)

  

我不确定我是否可以将所有这些JLabel和JTextField保留为类成员,然后可以自由地阅读它们。

是的,你可以,这就是你问题的解决方案。

时,请使用以下内容
//private JTextField manufacturerTextField;
private JTextField manufacturerTextField = new JTextField();

并且不要尝试在initialiseField()方法中创建文本字段。当然,你需要对标签做同样的事情。

  

所以我可以避免为每个字段重复相同的代码(在我的实际代码中有更多的代码)。

如果你想拥有包含这些字段的许多面板,那么你需要创建一个自定义类来创建面板,然后文本字段和标签将成为该类的一部分,而不是你的主类。

答案 1 :(得分:2)

问题是,假设方法initialiseField将参数contentTextField分配给manufactererTextField。正如David Wallace已经说过的那样,这在Java中不起作用。

如果要避免重复相同的代码,请尝试创建一个返回初始化TextField并在构造函数中指定它的方法。