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