如何在 JPanels 数组的元素上使用 addMouseListener 而无需将其添加到每个元素。?

How to use addMouseListener on the elements of an array of JPanels without adding it to each single element.?

我正在尝试制作一个国际象棋程序,其中我有一个 8x8 的 JPanel 数组,它们都需要一个 addMouseListener 但在这个 addMouseListener 中我需要使用该数组的索引才能工作,如下所示:

panels[0][0].addMouseListener(new MouseAdapter() {

        public void mousePressed(MouseEvent e) {
            panels[0][0].setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
        }

        public void mouseReleased(MouseEvent e) {

        }
    });

由于我有 64 个 JPanel,这意味着我需要将其复制 63 次,并且还需要复制可能的更改。有没有更好、更有效的方法来实现这一点?

Since I have 64 JPanels that means I need to copy this 63 times

你可以写一个通用的监听器

MouseListener ml = new MouseAdapter()
{
    @Override
    public void mousePressed(MouseEvent e)
    {
        JPanel panel = (JPanel)e.getSource();
        panel.setBorder(...);
    }
};

然后在你的循环代码中你只需要做:

panels[?][?].addMouseListener( ml );

您应该始终尝试编写通用侦听器,以便可以重用代码。

你应该为此使用一个循环:

for (int r = 0; r < panels.length; ++r) {
    for (int c = 0; c < panels[r].length; ++c) {
        // Do this to fix the "must be final" error:
        final int row = r;
        final int col = c;
        panels[row][col].addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                panels[row][col].setBorder(.....);
            }
            // ..... more
        });
    }
}

但是,还有一些其他方法可以解决这个问题。一个是你可以写一个 class 来保存面板的位置:

class MyMouseListener extends MouseAdapter {
    int panelRow;
    int panelCol;

    MyMouseListener(int panelRow, int panelCol) {
        this.panelRow = panelRow;
        this.panelCol = panelCol;
    }
    //.....
}

这基本上就是使用匿名 class 的示例在幕后所做的事情。您还可以保存对面板本身的引用。

或者您可以在 MouseEvent:

上使用 getSource() 方法
@Override
public void mousePressed(MouseEvent e) {
    JPanel panelWhichWasClicked = (JPanel) e.getSource();
    // .....
}

在这种情况下,您只需要 1 个鼠标侦听器即可将其添加到每个面板。

当你有一个数组时,你必须采取不同的方法。

首先,您的 class 应该实现具有 5 个抽象方法的 MouseListener,但您可能对 mouseClicked 感兴趣:

public class Example implements MouseListener{

@Override
public void mouseClicked(MouseEvent e) {
     JPanel panel = (JPanel) e.getSource(); // finding which panel is clicked on
}

@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
}  

然后在你 class 的某个地方你会做:

for(int i = 0; i < panels.length; i++){
     for(int j = 0; j < panels[0].length; j++){
         panels[0][0].addMouseListener(this);
     }
}