textfields中的getText返回null

时间:2014-11-22 17:19:54

标签: java swing null jtextfield

当程序试图从文本字段中获取文本时(在actionPreformed()中),即使文本字段中有文本,我也会收到错误java.lang.NullPointerException

只有按下“enter”按钮才会出现错误。我只需要在按下输入按钮时使用文本字段从用户获取整数值。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Main extends JFrame implements ActionListener {

    private JTextField textField1, textField2, time;

    public static void main(String[] args) {
        JFrame frame = new JFrame("Clock");
        frame.setSize(600, 600);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel p = new JPanel();
        JPanel p2 = new JPanel();
        JPanel p3 = new JPanel();
        JPanel p4 = new JPanel();

        JTextField textField1 = new JTextField(10);

        JTextField textField2 = new JTextField(10);

        JLabel label = new JLabel("Enter the Time");

        p.add(label);

        p.add(textField1);

        p.add(textField2);

        JButton button = new JButton("Enter");

        button.addActionListener(new Main());

        p2.add(button);

        JTextField time = new JTextField();
        time.setEditable(false);

        p3.add(time);

        frame.add(p, BorderLayout.PAGE_START);
        frame.add(p2, BorderLayout.PAGE_END);
        frame.add(p3, BorderLayout.CENTER);

        frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {

        if(e.getActionCommand().equals("Enter")){

            int int1 = Integer.parseInt(textField1.getText());
            int int2 = Integer.parseInt(textField2.getText());

            System.out.println(int1);
            System.out.println(int2);
        }

        System.out.println("Pressed");
    }

}

我该怎么做?

2 个答案:

答案 0 :(得分:0)

我认为执行的操作应该在按钮的addactionlistener中。这就像一个叫做匿名类的东西,它有自己的一组函数。尽管必须将textfields设置为final,但要在匿名类的函数中使用。

final JTextField textField1 = new JTextField(10);

final JTextField textField2 = new JTextField(10);

button.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e) {

        if(e.getActionCommand().equals("Enter")){

            int int1 = Integer.parseInt(textField1.getText());
            int int2 = Integer.parseInt(textField2.getText());

            System.out.println(int1);
            System.out.println(int2);
        }

      System.out.println("Pressed");


    }
});

答案 1 :(得分:0)

这些行隐藏了同名的类字段,这些字段在侦听器中使用 - 但它们不是添加到窗口小部件层次结构的字段。因此NPE。

JTextField textField1 = new JTextField(10);
JTextField textField2 = new JTextField(10);

现在您无法引用静态方法main中的类字段。将main用于任何应用程序特定的工作总是一个坏主意。从main中删除代码,将其放入一个真正的Main方法,让我们称之为build()。在main中创建一个(!)对象,从那里调用build(),从上面的两行中删除类名,并使用this设置监听器 - 不要创建另一个Main对象!