JPanel.addComponentListener не работает, когда прослушиватель является переменной класса

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

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;

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

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

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

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


person Coder    schedule 20.05.2010    source источник
comment
Вы можете использовать переменную класса. Что-то еще не так с вашим кодом. Разместите свой SSCCE: sscce.org   -  person camickr    schedule 21.05.2010
comment
Извините, я не понимаю, я использую переменную класса, и она находится в коде, который я разместил выше. Что вы имеете в виду, что что-то еще не так с моим кодом? Я также попробовал следующий слушатель ResizeListener = new ResizeListener(); panelResizeListener = listener;//ЭТА СТРОКА РАЗРЫВАЕТ ЭТО, я не понимаю, почему imagePanel.addComponentListener(listener); Также побочный вопрос, я не знаю, как форматировать свои сообщения как код, я пробовал смотреть на правки других людей, и похоже, что они просто добавляют пробелы впереди, но это не работает для меня, спасибо .   -  person Coder    schedule 21.05.2010
comment
Вы не опубликовали SSCCE (я дал вам ссылку, которая объясняет, что это такое), я не могу сказать вам, что не так с вашим кодом.   -  person camickr    schedule 21.05.2010


Ответы (2)


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

person Coder    schedule 21.05.2010

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

person Melody Horn    schedule 21.05.2010
comment
Спасибо за подсказку, я понял в чем проблема. - person Coder; 21.05.2010