繁体   English   中英

如何关闭活动的JFrame

[英]How to close the active JFrame

我正在尝试找到一种可以关闭活动JFrame的方法。

我无法使用frame.dispose(); ,因为我在工具栏类中声明了动作侦听器,并且我要关闭的框架不是静态的,而是在运行时声明的。

我试过使用:

java.awt.Window win[] = java.awt.Window.getWindows(); 
for(int i=0;i<win.length;i++){ 
win[i].dispose(); 
}

尽管这样做确实可行,但在某些情况下,即使看起来只有一个窗口打开,它也会关闭多个窗口,因此框架会根据用户执行的操作多次闪烁打开和关闭。

对于我来说,完全重新创建我的问题将涉及发布大量与MCVE原则不符的代码。

我希望有人会知道在acitveframe.dispose();模具中关闭活动框架的更简单可靠的方法。 -我现在不是真正的解决方案!!

如果您尝试获取动作事件的来源的Window祖先,会发生什么?

@Override
public void actionPerformed(ActionEvent actionEvent) {
    Component comp = (Component) actionEvent.getSource();
    Window win = SwingUtilities.getWindowAncestor(comp);
    win.dispose();
}

如果源不是组件,或者它不包含在顶级窗口中,则此方法将无效。


关于:

对于我来说,完全重新创建我的问题将涉及发布大量与MCVE原则不符的代码。

我敢打赌,您可以创建和发布接近的内容。

我希望有人会知道关闭活动框架的更简单可靠的方法

在循环中,您可以添加:

if (window.isActive())
   // do something

或更简单的方法是:

Window window = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();

另外,假设您的活动窗口是JFrame,而不是使用window.dispose() ,那么我将使用如下代码:

WindowEvent windowClosing = new WindowEvent(frame, WindowEvent.WINDOW_CLOSING);
frame.dispatchEvent(windowClosing);

这将模拟用户单击“关闭”按钮,这意味着您添加到框架的任何WindowListener也会被执行。 有关更多信息和想法,请参见关闭应用程序

声明JFrame时,如果不能使用static ,请将它们声明为final

final JFrame f = new JFrame();

它将解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM