使用动作侦听器的空指针异常错误

时间:2014-01-01 23:13:44

标签: java swing nullpointerexception syntax-error actionlistener

我在行img.setIcon(bg)上收到错误消息空指针异常;在我的动作监听器的控制器类中,我不知道为什么。我已经评论了错误突出显示的位置。关于为什么的任何想法?

    public class Display {
    public ImageIcon bg;
    public JLabel img;
    public void UI() {
        Controller listener = new Controller();
        bg = new ImageIcon("prophase.png");
        img = new JLabel(bg, JLabel.CENTER);
        JFrame gameFrame = new JFrame();
        JPanel top = new JPanel();
        JPanel bottom = new JPanel();
        JPanel imgPane = new JPanel();
        JPanel panel1 = new JPanel();
        imgPane.setLayout(new BorderLayout());
        panel1.setLayout(new BorderLayout());
        panel1.setOpaque(false);// !!
        top.setBorder(BorderFactory.createTitledBorder(""));
        bottom.setBorder(BorderFactory.createTitledBorder(""));
        JLabel jl = new JLabel("What stage of mitosis is this?", JLabel.CENTER);
        imgPane.add(img);// center
        top.add(jl);// top center
        top.add(listener.wordListener());// top center
        bottom.add(listener.answer);// bottom
        panel1.add(imgPane, BorderLayout.CENTER);// background image (center)
        panel1.add(top, BorderLayout.NORTH);// text field and jlabel (top)
        panel1.add(bottom, BorderLayout.SOUTH);// blank spaces and letters used
        gameFrame.setJMenuBar(menuBar());
        gameFrame.setTitle("Mitosis");
        gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gameFrame.setIconImage(new ImageIcon("logo.png").getImage());
        gameFrame.setResizable(false);
        gameFrame.add(panel1);
        gameFrame.setSize(400, 300);
        gameFrame.setLocationRelativeTo(null);
        gameFrame.setVisible(true);
    }
}

另一堂课:

 public class Controller {
    Display display = new Display();
    private JFrame dialogFrame = new JFrame();
    private ImageIcon logo = new ImageIcon("logo.png");
    public String word;
    public JLabel answer = new JLabel(" ", JLabel.CENTER);
        public JTextField wordListener() {
            JTextField tf = new JTextField(10);
            tf.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {// right click key
                    JTextField tf = (JTextField) e.getSource();
                    word = tf.getText();
                    if (word.equalsIgnoreCase("Prophase")) {
                        answer.setText("Correct!");
                        ImageIcon bg = display.bg;
                        JLabel img = display.img;
                        bg = new ImageIcon("interphase.png");
                        img.setIcon(bg);//error
                        answer.setText(" ");
                    } else {
                        answer.setText("Incorrect, try again.");
                    }
                    tf.setText("");
                }// end actionPerformed method
            });
            return tf;
        }
    }

2 个答案:

答案 0 :(得分:1)

Display的默认构造函数未初始化属性img,默认情况下会将其初始化为null。例外情况显然是由于您尝试使用img而未在任何地方初始化它。您应该为Display定义一个类似这样的默认构造函数:

public Display(){
    UI();
}

因为在UI()中您正在初始化img。 此外,您必须在使用display之前初始化img,如下所示:

Display display = new Display();

答案 1 :(得分:0)

请检查图像的路径是否正确

bg = new ImageIcon("interphase.png");

如果找不到资源,当您尝试在其他位置使用该imageicon时,您将收到NullPointerException。

尝试一下

getClass().getResource("interphase.png");
如果需要,

预先添加目录名称,以便在您的资源中获取图像。

另外,在使用之前,请确保在Display类中初始化变量。