我有这段代码,我正在尝试将MouseListener添加到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();
}
};
}
}
答案 0 :(得分:2)
你应该在使用它们之前初始化数组中的所有元素,因为这一行创建了一个里面有nulls
的数组
fields = new JTextField[totalX][totalY];
所以提前创建一个新的数组元素
fields[x][y] = new JTextField();
fields[x][y].addMouseListener(this);
BTW你的代码看起来有点奇怪,你创建一个新的MouseAdapter()但不使用它。所以,它将被垃圾收集。
更新:您应该将new MouseAdapter()
作为addMouseListener()
方法的参数
fields[x][y].addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
... Put your code here ...
});
答案 1 :(得分:0)
我认为对匿名内部类的工作方式存在误解,关键字this
的实际工作方式也存在误解。
在您的代码中,您说:
fields[x][y].addMouseListener(this);
通过将单词this
传入此方法,您将传入您当前所在的Object。这意味着它自己的当前类是一个MouseListener,即implements
接口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();
}
};
所以解决方案可能是:
将关键字this
替换为您创建的新对象,如下所示:
fields [x] [y] .addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent e){
//这里的所有实施代码
}
}
);
使您当前的类实现MouseListner并实现所有方法或只是您想要使用的方法。