Как ссылаться на объект из обработчика - PullRequest
1 голос
/ 22 мая 2011

Итак, у меня есть слушатель мыши, который подключен к нескольким объектам следующим образом:

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

Теперь у меня проблема в том, что мне нужно знать, какой из объектов активировал обработчик

очевидно, это не сработает, поскольку переменная «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) {
    }

Ответы [ 2 ]

1 голос
/ 22 мая 2011

Вы можете использовать e.getSource(), чтобы получить источник события.

Кроме того, по возможности используйте ActionListener (если пользователь может выбирать с клавиатуры).

И еще одна вещь - если слушатель является универсальным, вы можете создать только один его экземпляр вместо нового экземпляра для каждого компонента:

GameMouseListener listener = new GameMouseListener();
for (int i = 0; i < Grids.size(); i++) {
     Grids.get(i).addMouseListener(listener); 
}
0 голосов
/ 22 мая 2011

вы можете передать объект в конструктор, так как вы все равно создаете новый для каждого объекта (или используйте e.getSource(), когда вы создаете только один слушатель)

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