JPanel.addComponentListener не работает, когда слушатель является переменной класса - PullRequest
1 голос
/ 21 мая 2010

У меня есть открытый класс, который имеет следующий метод и переменную экземпляра:

public void setImagePanel(JPanel value) {
  imagePanel = value;

  if (imagePanel != null) {

     //method 1 : works
     imagePanel.addComponentListener(new ComponentAdapter() {

        public void componentResized(ComponentEvent evt) {
           System.out.println("Here 1");
        }

     });

     //method 2 :  does not work
     panelResizeListener = new ResizeListener();
     imagePanel.addComponentListener(panelResizeListener);

     //method 3 : works
     //ResizeListener listener = new ResizeListener();
     //imagePanel.addComponentListener(listener);

     //method 4 : works
     //imagePanel.addComponentListener(new ResizeListener());

     //method 5 : does not work -- THIS IS THE DESIRED CODE I WANT TO USE
     imagePanel.addComponentListener(panelResizeListener);
  }
}

public class ResizeListener extends ComponentAdapter {

  @Override
  public void componentResized(ComponentEvent evt) {
     System.out.println("RESIZE 3");
  }

}

private ResizeListener panelResizeListener = new ResizeListener();
private static JPanel imagePanel;

Каждый из приведенных выше методов соответствует коду непосредственно ниже до следующего комментария // метода. Я не понимаю, почему я не могу использовать переменную экземпляра класса и добавить ее к JPanel в качестве слушателя компонента.

Что происходит в описанных выше случаях, когда я говорю, что метод не работает, так это то, что я не получаю сообщения журнала "RESIZE 3". Во всех случаях, когда я перечисляю, что это работает, я получаю сообщения "RESIZE 3".

Внешний класс является общедоступным без каких-либо других изменений, за исключением того, что он реализует созданный мной интерфейс (который не имеет методов или переменных, общих с методами и переменными, перечисленными выше).

Если кто-нибудь может мне помочь, я был бы очень признателен. Эта проблема не имеет смысла для меня, код должен быть идентичным.

Ответы [ 2 ]

2 голосов
/ 21 мая 2010

Человек Камикр, ты был прав. Чувак, это было странно решать. Что-то не так с моим кодом. Порядок вызовов методов в моем классе привел к тому, что я добавил слушателя, тогда другой метод закончил бы тем, что удалил слушателя, на который ссылается эта переменная, поэтому, конечно, я никогда не получал события. Большое спасибо за помощь, чел.

1 голос
/ 21 мая 2010

Я думаю, что ваша проблема в том, что вы объявляете panelResizeListener после его использования. Это обычно убивает почти все.

...