我应该使用什么事件来检测自定义JComponent中的父JFrame结束?

时间:2014-03-11 14:49:51

标签: java swing jframe windowlistener

我将自定义JComponent放置在JFrame(位于JPanelJFrame上)。我使用setDefaultCloseOperation()JFrame设置为DISPOSE_ON_CLOSE

我的自定义组件有一个Timer,在框架关闭后继续运行。我知道我可以向WindowListener添加JFrame,然后调用自定义组件来停止,但我更希望将我的组件完全封装起来。是否有任何可用于检测父JFrame已从JComponent内关闭的事件?

4 个答案:

答案 0 :(得分:5)

  1. 您是否已实施windowClosing的{​​{1}}事件。
  2. WindowListener添加到自定义组件并收听AncestorListener事件。将组件添加到可见GUI或实现包含组件的GUI时,会生成此事件。
  3. ancestorAdded事件中,将WindowListener添加到框架中。您可以使用ancestorAdded方法获取当前帧。
  4. 现在所有的逻辑都是自己包含在你的班级中。

答案 1 :(得分:1)

您可以尝试使用此代码。

frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); //here other actions
} } );

其中frame是JFrame的对象

答案 2 :(得分:1)

您还可以使用HierarchyListener

//@see javax/swing/plaf/basic/BasicProgressBarUI.java
class Handler implements ChangeListener, PropertyChangeListener, HierarchyListener {
    // we don't want the animation to keep running if we're not displayable
    @Override public void hierarchyChanged(HierarchyEvent he) {
        if ((he.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) != 0) {
            if (progressBar.isIndeterminate()) {
                if (progressBar.isDisplayable()) {
                    startAnimationTimer();
                } else {
                    stopAnimationTimer();
                }
            }
        }
    }
    //...
}

答案 3 :(得分:0)

如果你的组件需要对某种事件做出反应,它必须实现某种类型的监听器 - 那么为什么不让你的组件实现WindowListener并将其注册到所有者JFrame?