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

时间:2017-06-11 05:19:55

标签: java arrays loops listener

我有这段代码,我正在尝试将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();
            }
        };
    }
}

2 个答案:

答案 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();
                    }
                };

所以解决方案可能是:

  1. 将关键字this替换为您创建的新对象,如下所示:

    fields [x] [y] .addMouseListener(new MouseAdapter(){

        @Override
         public void mousePressed(MouseEvent e){
    

    //这里的所有实施代码

    }
     }  );

  2. 使您当前的类实现MouseListner并实现所有方法或只是您想要使用的方法。