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

vox xyn

我正在用Java创建Minesweeper的版本,但是在为toggleButtons设置鼠标侦听器时遇到了问题。我需要在左右单击上做不同的事情,所以到目前为止,这是我在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);
        }
    }

但是,我在标记的行之一上得到了“ nullPointerException”(取决于L或R单击):

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
      at MyPanel$1.museReleased(MyPanel.java:31)
      at java.AWTEventMulticaster.mouseReleased(Unknown Source)

这看起来像是'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;
    }
}

--

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

/** model of minesweeper game: contains mine arrays, as well as methods
for left and right click responses.**/
public class gameEngine {

    private int[][] mines;
    private int Row;
    private int Col;

    //seed based random number generator
    double rnd(){
        int seed = 42;
        Random gen = new Random(seed);
        double output = gen.nextDouble();

        return output;
    }

    /*generate array to represent minefield. generated array will contain only 0s and 1s
    possible cases of array are:
    0: no mine, unmarked
    1: mine, unmarked
    2: no mine: marked
    3: mine: marked */

    //this method generates initial empty array, then calls layMines to populate it
    public void initField(){
        mines = new int[10][10];
        for (int i=0; i<10; i++)
            for(int j=0; j<10; j++)
                mines[i][j] = 0;
        layMines();
    }

    //lays 16 mines into the array using a random number generator
    public void layMines(){
        int minesOnField = 0;
        for (int i=0; i<10; i++) 
            for (int j=0; j<10; j++)
                if (rnd() >=70) { //if roll is successful
                    if (minesOnField < 16){ //and less than 16 mines have been
                        if(mines[i][j] == 0) { //AND it isnt already a mine
                            minesOnField ++;
                            mines[i][j] = 1;
                        }
                    }
                }                
    }

    public void showCell(int x) {
    }

    public void markCell(int x){

    }

    public void test() {
        initField();
        System.out.println(Arrays.deepToString(mines));
    }

}

我的“主要”方法只是调用“ 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。

您应该初始化引擎。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

单击侦听器上的单选按钮仅在选择切换按钮后才能工作

来自分类Dev

我可以切换onClick侦听器吗?

来自分类Dev

canvas事件侦听器切换参数状态

来自分类Dev

我可以切换onClick侦听器吗?

来自分类Dev

ListView项目长按侦听器抛出空指针异常

来自分类Dev

空指针异常-事件和侦听器

来自分类Dev

切换窗口时出现空指针异常

来自分类Dev

如何设置侦听器以在导航抽屉中切换?

来自分类Dev

如何设置侦听器以在导航抽屉中切换?

来自分类Dev

选中菜单项切换的已更改侦听器

来自分类Dev

将参数传递给事件侦听器以进行单位切换

来自分类Dev

如何为复选框侦听器切换正确的类?

来自分类Dev

无法使用 setOnCheckedChange(onCheckedChange) 获取切换侦听器

来自分类Dev

在设置回收器项目单击侦听器时获取空指针异常

来自分类Dev

共享首选项在切换片段时导致空指针异常

来自分类Dev

如何在不和谐中使用命令切换触发齿轮侦听器

来自分类Dev

切换事件侦听器的大小写有时会触发事件

来自分类Dev

是否有用于在列表上切换 View 属性布尔值的 Android 侦听器?

来自分类Dev

鼠标侦听器类

来自分类Dev

如何在切换按钮内更改鼠标光标

来自分类Dev

如何在Windows 7中禁用滚轮鼠标按钮,以使其不显示任务切换器

来自分类Dev

DatePickerDialog +/-按钮的侦听器

来自分类Dev

DatePickerDialog +/-按钮的侦听器

来自分类Dev

空指针异常切换为Pocketsphinx演示中的搜索

来自分类Dev

使用鼠标侦听器拖动对象

来自分类Dev

鼠标侦听器on_move事件

来自分类Dev

QT全局鼠标侦听器

来自分类Dev

使用鼠标侦听器拖动对象

来自分类Dev

如何使用包装器控制按钮的切换

Related 相关文章

热门标签

归档