如何在JPanel数组的元素上使用addMouseListener而不将其添加到每个单独的元素。

时间:2017-05-06 21:12:39

标签: java swing jpanel mouseevent mouselistener

我正在尝试创建一个国际象棋程序,其中我有一个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个JPanels,这意味着我需要复制63次,并且还需要复制可能的更改。有没有更好,更有效的方法来实现这一目标?

3 个答案:

答案 0 :(得分:3)

  

因为我有64个JPanels,这意味着我需要复制63次

您可以编写通用侦听器

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

然后在循环代码中执行:

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

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

答案 1 :(得分:2)

你应该使用一个循环:

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;
    }
    //.....
}

这基本上就是在幕后使用匿名类的例子。您还可以保存对面板本身的引用。

或者您可以使用getSource()上的MouseEvent方法:

@Override
public void mousePressed(MouseEvent e) {
    JPanel panelWhichWasClicked = (JPanel) e.getSource();
    // .....
}

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

答案 2 :(得分:0)

当你有阵列时,你必须采取不同的方法。

首先你的类应该实现MouseListener,它有5个抽象方法,但你可能对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) {}
}  

然后你班上的某个地方你会这样做:

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