我将自定义JComponent放置在JFrame(位于JPanel的JFrame上)。我使用setDefaultCloseOperation()将JFrame设置为DISPOSE_ON_CLOSE
。
我的自定义组件有一个Timer,在框架关闭后继续运行。我知道我可以向WindowListener添加JFrame,然后调用自定义组件来停止,但我更希望将我的组件完全封装起来。是否有任何可用于检测父JFrame已从JComponent内关闭的事件?
答案 0 :(得分:5)
windowClosing
的{{1}}事件。WindowListener
添加到自定义组件并收听AncestorListener
事件。将组件添加到可见GUI或实现包含组件的GUI时,会生成此事件。ancestorAdded
事件中,将WindowListener添加到框架中。您可以使用ancestorAdded
方法获取当前帧。现在所有的逻辑都是自己包含在你的班级中。
答案 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?