Java 如何关闭活动JFrame

Java 如何关闭活动JFrame,java,swing,user-interface,jframe,dispose,Java,Swing,User Interface,Jframe,Dispose,我试图找到一种方法,可以关闭活动的JFrame 我无法使用frame.dispose(),因为我在工具栏类中声明操作侦听器,并且我要关闭的帧不是静态的,而是在运行时声明的 我试过使用: java.awt.Window win[] = java.awt.Window.getWindows(); for(int i=0;i<win.length;i++){ win[i].dispose(); } java.awt.windowwin[]=java.awt.Window.getWindo

我试图找到一种方法,可以关闭活动的JFrame

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

我试过使用:

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

对于(int i=0;i如果尝试获取操作事件源的窗口祖先会发生什么情况?即

@Override
public void actionPerformed(ActionEvent actionEvent) {
    Component comp = (Component) actionEvent.getSource();
    Window win = SwingUtilities.getWindowAncestor(comp);
    win.dispose();
}
如果源不是一个组件或者它不包含在感兴趣的顶级窗口中,那么这将不起作用


关于:

对于我来说,要完全重现我的问题,需要发布大量不符合MCVE原则的代码


我敢打赌,只要你努力一点,你就可以创建并发布一些接近的东西。

如果你试图获取动作事件源的窗口祖先,会发生什么呢

@Override
public void actionPerformed(ActionEvent actionEvent) {
    Component comp = (Component) actionEvent.getSource();
    Window win = SwingUtilities.getWindowAncestor(comp);
    win.dispose();
}
如果源不是一个组件或者它不包含在感兴趣的顶级窗口中,那么这将不起作用


关于:

对于我来说,要完全重现我的问题,需要发布大量不符合MCVE原则的代码


我敢打赌,只要你努力一点,你就可以创建并发布一些接近的东西。

如果你试图获取动作事件源的窗口祖先,会发生什么呢

@Override
public void actionPerformed(ActionEvent actionEvent) {
    Component comp = (Component) actionEvent.getSource();
    Window win = SwingUtilities.getWindowAncestor(comp);
    win.dispose();
}
如果源不是一个组件或者它不包含在感兴趣的顶级窗口中,那么这将不起作用


关于:

对于我来说,要完全重现我的问题,需要发布大量不符合MCVE原则的代码


我敢打赌,只要你努力一点,你就可以创建并发布一些接近的东西。

如果你试图获取动作事件源的窗口祖先,会发生什么呢

@Override
public void actionPerformed(ActionEvent actionEvent) {
    Component comp = (Component) actionEvent.getSource();
    Window win = SwingUtilities.getWindowAncestor(comp);
    win.dispose();
}
如果源不是一个组件或者它不包含在感兴趣的顶级窗口中,那么这将不起作用


关于:

对于我来说,要完全重现我的问题,需要发布大量不符合MCVE原则的代码


我敢打赌,只要你付出一点努力,你就可以创建并发布一些接近的东西。

当你声明你的JFrames时,如果你不能使用static,请将它们声明为final

final JFrame f = new JFrame();

这将解决问题。

当您声明JFrames时,如果无法使用静态,请将其声明为最终

final JFrame f = new JFrame();

这将解决问题。

当您声明JFrames时,如果无法使用静态,请将其声明为最终

final JFrame f = new JFrame();

这将解决问题。

当您声明JFrames时,如果无法使用静态,请将其声明为最终

final JFrame f = new JFrame();
这将解决问题

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

在循环中,您可以添加:

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都将被执行。有关更多信息和想法,请参阅

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

在循环中,您可以添加:

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都将被执行。有关更多信息和想法,请参阅

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

在循环中,您可以添加:

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都将被执行。有关更多信息和想法,请参阅

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

在循环中,您可以添加:

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都将被执行。有关更多信息和想法,请参阅。

我在工具栏类中声明操作侦听器,并且我要关闭的框架不是静态的,而是在运行时声明的。请参阅。我在工具栏类中声明操作侦听器,并且我要关闭的框架不是静态的,并且在运行时声明。请参阅。我在工具栏类中声明动作侦听器,并且我要关闭的帧不是静态的,并且在运行时声明。请参阅。我在工具栏类中声明动作侦听器,并且我要关闭的帧不是静态的,并且在运行时声明。请参阅。