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