Java 尝试将侦听器添加到JTextFields数组时出错

Java 尝试将侦听器添加到JTextFields数组时出错,java,arrays,loops,listener,Java,Arrays,Loops,Listener,我有这段代码,我正在尝试向JTextFields的2D数组中添加鼠标侦听器。我得到了一个NullPointerException,我不确定哪里做错了。下面是我正在使用的一些变量 private int totalX = 20; private int totalY = 20; private JTextField[][] fields; fields = new JTextField[totalX][totalY]; for (y = 0; y < totalY; y++) {

我有这段代码,我正在尝试向
JTextFields
的2D数组中添加鼠标侦听器。我得到了一个
NullPointerException
,我不确定哪里做错了。下面是我正在使用的一些变量

private int totalX = 20;
private int totalY = 20;

private JTextField[][] fields;
fields = new JTextField[totalX][totalY];

for (y = 0; y < totalY; y++) {
    for (x = 0; x < totalX; x++) {
        fields[x][y].addMouseListener(this);
        new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                for (y = 0; y < totalY; y++) {
                    for (x = 0; x < totalX; x++) {
                        if (fields[x][y].hasFocus()) {
                            if (value == null) {
                                value = "W";
                            } else {
                                fields[x][y].setText(value);
                            }
                        }
                    }
                }
                Draw();
            }
        };
    }
}
private int totalX=20;
私人整数总计=20;
私有JTextField[][]字段;
字段=新的JTextField[totalX][totalY];
对于(y=0;y
您应该在使用数组中的所有元素之前对它们进行初始化,因为此行创建了一个内部带有
空值的数组

fields = new JTextField[totalX][totalY];
因此,请提前创建一个新的数组元素

fields[x][y] = new JTextField();
fields[x][y].addMouseListener(this);
顺便说一句,您的代码看起来有点奇怪,您创建了一个新的MouseAdapter(),但没有使用它。因此,它将被垃圾收集

更新:您应该将您的
新MouseAdapter()
作为
addMouseListener()
方法的参数

fields[x][y].addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed(MouseEvent e) {
        ... Put your code here ...
    });

您应该在使用数组中的所有元素之前对它们进行初始化,因为此行将创建一个内部包含
null
的数组

fields = new JTextField[totalX][totalY];
因此,请提前创建一个新的数组元素

fields[x][y] = new JTextField();
fields[x][y].addMouseListener(this);
顺便说一句,您的代码看起来有点奇怪,您创建了一个新的MouseAdapter(),但没有使用它。因此,它将被垃圾收集

更新:您应该将您的
新MouseAdapter()
作为
addMouseListener()
方法的参数

fields[x][y].addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed(MouseEvent e) {
        ... Put your code here ...
    });

我认为,对于匿名内部类的工作原理,以及关键字
this
的实际工作原理,存在一种误解

在代码中,您说:

fields[x][y].addMouseListener(this);
通过将单词
this
传递到此方法中,您正在传递您所处的当前对象。这意味着当前类本身是一个MouseListener,也就是说它实现了接口
MouseListener
,在这个类中,您已经实现了MouseListener定义的所有5个方法,或者当前类扩展了名为
MouseAdapter
的抽象类(它自己也实现了MouseListener)

因此,在您的代码中,您有一个MouseAdapter对象(定义为内部类),它完全悬空,并且没有任何用处,因为它没有在任何地方使用:

new MouseAdapter() {
                    @Override
                    public void mousePressed(MouseEvent e) {
                        for (y = 0; y < totalY; y++) {
                            for (x = 0; x < totalX; x++) {
                                if (fields[x][y].hasFocus()) {
                                    if (value == null) {
                                        value = "W";
                                    } else {
                                        fields[x][y].setText(value);
                                    }
                                }
                            }
                        }
                        Draw();
                    }
                };
//所有的实现代码都在这里

}
} );

  • 让您当前的类实现MouseListner,并实现所有方法或仅实现您想要使用的方法


  • 我认为,对于匿名内部类的工作原理,以及关键字
    this
    的实际工作原理,存在一种误解

    在代码中,您说:

    fields[x][y].addMouseListener(this);
    
    通过将单词
    this
    传递到此方法中,您正在传递您所处的当前对象。这意味着当前类本身是一个MouseListener,也就是说它实现了接口
    MouseListener
    ,在这个类中,您已经实现了MouseListener定义的所有5个方法,或者当前类扩展了名为
    MouseAdapter
    的抽象类(它自己也实现了MouseListener)

    因此,在您的代码中,您有一个MouseAdapter对象(定义为内部类),它完全悬空,并且没有任何用处,因为它没有在任何地方使用:

    new MouseAdapter() {
                        @Override
                        public void mousePressed(MouseEvent e) {
                            for (y = 0; y < totalY; y++) {
                                for (x = 0; x < totalX; x++) {
                                    if (fields[x][y].hasFocus()) {
                                        if (value == null) {
                                            value = "W";
                                        } else {
                                            fields[x][y].setText(value);
                                        }
                                    }
                                }
                            }
                            Draw();
                        }
                    };
    
    //所有的实现代码都在这里

    }
    } );

  • 让您当前的类实现MouseListner,并实现所有方法或仅实现您想要使用的方法


  • 你能添加完整的堆栈错误吗?另外,完整的类代码help@DamianLattenero我对编码相当陌生,在哪里可以得到完整的堆栈错误?上面的代码,我把它放在
    private void run()
    下,而不是在一个单独的类中。你只需添加堆栈错误的一小部分,表示NullPointerException的部分,文本的其余部分,就是整个堆栈:),总之,用户检测到了你的错误,所以检查答案,不要忘记接受它是否有效(答案中左上角的复选框表示接受)您可以添加完整的堆栈错误吗?完整的类代码也将被删除help@DamianLattenero我对编码相当陌生,在那里我可以得到完整的堆栈错误?上面的代码,我把它放在
    private void run()下
    并且不在单独的类中。您只需添加堆栈错误的一小部分,表示NullPointerException的部分,文本的其余部分,就是整个堆栈:),无论如何,用户检测到您的错误,所以请检查答案,不要忘了接受是否有效(使用答案左上方的复选框接受)添加此行
    fields[x][y]=new JTextField()
    阻止应用程序崩溃,但我尝试使用
    System.err.println(“Test”)测试它是否真的在监听鼠标操作但没有输出。@Nicz您发布的代码无法工作,因为您创建但未使用MouseAdapter的Objects讨厌麻烦,但您能给我一个如何执行的示例吗?我还在学习如何编码,所以我不太懂。我不擅长桌面应用程序,你的代码也很奇怪。我改变了答案。不过,这只是一个猜测。我建议初学者阅读一本好书,添加以下行
    fields[x][y]=new JTextField()
    阻止应用程序崩溃,但我尝试使用
    System.err.println(“Test”)测试它是否真的在监听鼠标操作但没有输出。@Nicz您发布的代码无法工作,因为您创建了但没有使用MouseAdapter的ObjectT