当侦听器是类变量时,JPanel.addComponentListener不起作用

时间:2010-05-20 23:08:27

标签: java listener listeners event-listener

我有一个公共类,它有以下方法和实例变量:

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 个答案:

答案 0 :(得分:2)

男人,你是对的。男人这是一个奇怪的解决方案。我的代码还有其他问题。方法调用到我的类的顺序导致我添加了监听器然后另一个方法将最终删除该变量引用的监听器,所以当然我永远不会得到事件。非常感谢所有帮助人员。

答案 1 :(得分:1)

我认为你的问题是你在使用它之后声明了panelResizeListener。这通常可以杀死任何东西。