我应该使用什么事件来检测定制jcomponent中的父jframe关闭?

eni9jsuy  于 2021-07-09  发布在  Java
关注(0)|答案(4)|浏览(252)

我在jframe中放置了一个定制的jcomponent(很好地放置在jframe上的jpanel中)。我使用setdefaultcloseoperation()将jframe设置为 DISPOSE_ON_CLOSE .
我的自定义组件有一个计时器,在框架关闭后继续运行。我知道我可以在jframe中添加一个windowlistener,然后调用自定义组件停止,但是我更希望我的组件被完全封装。当父jframe从jcomponent中关闭时,是否有任何事件可用于检测?

wljmcqd8

wljmcqd81#

你可以试试这个代码。 frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); //here other actions } } ); 其中frame是jframe的对象

2uluyalo

2uluyalo2#

如果您的组件需要对某种事件做出React,那么它必须实现某种侦听器——那么为什么不让您的组件实现windowlistener并向所有者jframe注册它呢?

a7qyws3x

a7qyws3x3#

你们班实施了吗 windowClosing 事件 WindowListener .
添加 AncestorListener 到您的自定义组件并侦听 ancestorAdded 事件。当您将组件添加到可见的gui或实现包含组件的gui时,会生成此事件。
ancestorAdded 事件将windowlistener添加到框架中。您可以使用 SwingUtilties.windowForComponent(...) 方法。
现在所有的逻辑都包含在你的类中了。

dly7yett

dly7yett4#

你也可以使用 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();
                }
            }
        }
    }
    //...
}

相关问题