Java 切换按钮鼠标侦听器空指针异常

Java 切换按钮鼠标侦听器空指针异常,java,mouselistener,togglebutton,Java,Mouselistener,Togglebutton,我正在用java创建一个版本的扫雷器,但是在设置切换按钮的鼠标侦听器时遇到了问题。我需要在左键和右键单击上执行不同的操作,因此这是我目前在MyPanel类中设置的内容: import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; public class MyPanel extends JPanel { JToggleButt

我正在用java创建一个版本的扫雷器,但是在设置切换按钮的鼠标侦听器时遇到了问题。我需要在左键和右键单击上执行不同的操作,因此这是我目前在MyPanel类中设置的内容:

import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;

    public class MyPanel extends JPanel {

        JToggleButton jButtons[] = new JToggleButton[100];
        int i = 0;

        MyFrame frame;
        JLabel testOut;
        gameEngine engine;

        public MyPanel(MyFrame mf) {
            for (i = 0; i< 100; i++) {
                jButtons[i] = new JToggleButton("");
                jButtons[i].addMouseListener(new MouseAdapter() {
                    public void mouseReleased(MouseEvent e) {
                        if(SwingUtilities.isLeftMouseButton(e)) { //**Exception here**
                            engine.markCell(i);
                            System.out.println("L-click");
                        } else if(SwingUtilities.isRightMouseButton(e)) { //**or here**
                            engine.showCell(i);
                            System.out.println("R-click");
                        }
                    }
                });
            //System.out.print(i);
            add(jButtons[i]);
            }
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
        }
    }
这看起来像是“MouseEvent”抛出了异常,但我不明白它为什么会抛出异常,更不用说如何修复它了

这里是我的其他类,所以您可以看到“MyFrame”和“gameEngine”指的是什么

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;

public class MyFrame extends JFrame {

    JToggleButton jButtons[] = new JToggleButton[100];

    gameEngine engine;
    MyPanel panel;

    public MyFrame() {
        setTitle("Minesweeper");
        setSize(500,500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel = new MyPanel(this);
        panel.setLayout(new GridLayout(10,10));

        add(panel);
        setVisible(true);
        setResizable(false);
    }

    public gameEngine getGame() {
        return engine;
    }
}
-


我的“main”方法只调用“MyFrame”。

您将gameEngine声明为

gameEngine engine;
虽然您从未初始化它,但您使用它的方式如下:

if(SwingUtilities.isLeftMouseButton(e)) { //**Exception here**
    engine.markCell(i);
    ...
} else if(SwingUtilities.isRightMouseButton(e)) { //**or here**
    engine.showCell(i);
    ..
默认情况下,如果未初始化对象,则将其初始化为null,并且对null的任何方法调用都将导致NullPointerException

您应该初始化引擎

gameEngine engine;
if(SwingUtilities.isLeftMouseButton(e)) { //**Exception here**
    engine.markCell(i);
    ...
} else if(SwingUtilities.isRightMouseButton(e)) { //**or here**
    engine.showCell(i);
    ..