MouseListeners обнаруживаются только в последнем JLabel, созданном в цикле - PullRequest
2 голосов
/ 30 ноября 2011

У меня проблема с добавлением MouseListeners к установленному количеству Jlabels, которые создаются внутри цикла. Программе, которую я создаю, необходимо изменить значок JLabel, когда пользователь наводит курсор на метку.

Я создал цикл for для инициализации метки, объявленной глобально, установки границы, добавления прослушивателя мыши и добавления метки на панель.

JLabel label;
for(int i = 0; i < 20; i++)
{
  label = new JLabel();
  label.setBorder(new LineBorder(Color.BLACK));
  label.setMouseListener(this);
  panel.add(label);
}
container.add(panel);

Тогда в моем слушателе мыши у меня есть

public void mouseEntered(MouseEvent e)
{
  if(e.getSource().equals(label))
  {
     label.setIcon(image);
  }
}

Кажется, это работает нормально, он добавляет 20 меток к рамке и добавляет рамку, но по какой-то причине прослушиватель действий активируется только на последней добавленной метке. Может кто-нибудь сказать мне, почему это происходит или указать мне правильное направление, пожалуйста?

Любая помощь приветствуется.

Ответы [ 3 ]

5 голосов
/ 30 ноября 2011

У вас есть только один JLabel, на который ссылается переменная label, последний использованный, и поэтому блок if будет проверять источник - последний JLabel. Другими словами, ваш код делает только то, что вы говорите. Что вы пытаетесь сделать с этим, если блок?

5 голосов
/ 30 ноября 2011

((JLabel)e.getSource()).setIcon(image);?

0 голосов
/ 30 ноября 2011

Смотрите мои встроенные комментарии для объяснения: -

JLabel label;
for(int i = 0; i < 20; i++)
{
  label = new JLabel(); // variable re-assignment!
  label.setBorder(new LineBorder(Color.BLACK));
  label.setMouseListener(this);
  panel.add(label);
}
// after executing the loop 20 times,
// 1) 'label' will hold the 20th instance of the JLabel due to variable re-assignment in loop
// 2) 'panel' will have 20 different instances of JLabel
container.add(panel);

Теперь, чтобы решить вашу проблему, у вас должно быть 20 разных экземпляров слушателя мыши, и у каждого слушателя мыши должен быть свой JLabel.

...