1

所以我有一个鼠标监听器,它连接到多个对象,如下所示:

for (int i = 0; i < Grids.size(); i++) {
     Grids.get(i).addMouseListener(new GameMouseListener()); 
   }

现在我遇到的问题是我需要知道哪些对象激活了处理程序

显然这不会起作用,因为 var "i" 没有在类中定义,只在前面的 for 循环中使用。如何使用处理程序知道单击了哪个特定对象。

 public class GameMouseListener implements MouseListener {

    @Override
    public void mouseClicked(MouseEvent e) {
        if (Grid.get(i).isSelected()) {

            Grid.get(i).unselected();
        } else {

            Grid.get(i).selected();
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }
4

2 回答 2

1

您可以使用e.getSource()来获取事件的来源。

此外,ActionListener尽可能考虑使用(如果用户可能使用键盘进行选择)。

还有一件事 - 如果侦听器是通用的,您可能只创建它的一个实例,而不是为每个组件创建新实例:

GameMouseListener listener = new GameMouseListener();
for (int i = 0; i < Grids.size(); i++) {
     Grids.get(i).addMouseListener(listener); 
}
于 2011-05-22T17:46:11.383 回答
0

您可以在构造函数中传递对象,因为您无论如何都要为每个对象创建一个新对象,(或者e.getSource()在您只创建一个侦听器时使用)

for (int i = 0; i < Grids.size(); i++) {
   Grids.get(i).addMouseListener(new GameMouseListener( Grids.get(i))); 
}
于 2011-05-22T17:49:50.360 回答