如何在 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);
}
}
我正在尝试制作一个国际象棋程序,其中我有一个 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);
}
}