java - 当没有更多窗口打开时结束 Java AWT 线程

标签 java multithreading swing jframe awt

我有一个 JFrame 的 ArrayList,我希望能够检测到所有窗口何时关闭,从而结束程序。

到目前为止,每次创建 JFrame 时,我都会将其添加到数组列表中。我还实现了一个 WindowListener,并在调用 windowClosing() 时从列表中删除该 JFrame。

但是,我的问题是当列表为空时程序不会结束。通常,我使用frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE),但现在我有多个窗口,这不起作用。我应该手动调用 System.Exit(0);或者是否有更优选的终止程序的方式。

谢谢

示例

public class MainFrame extends JFrame{

private static final ArrayList<MainFrame> frameList = new ArrayList<MainFrame>();

public static void main(String[] args){
    newFrame();
    newFrame();
    newFrame();
}

public MainFrame(){     
    addWindowListener(new Listener());
    setSize(800, 600);
    setVisible(true);
}

class Listener implements WindowListener{
    public void windowClosing(WindowEvent arg0) {
        frameList.remove(MainFrame.this);
        if(frameList.size() == 0){
             //End Program
        }
    }
}

public static void newFrame() {
    frameList.add(new MainFrame());
}   

}

最佳答案

基本上,如果将 defaultCloseOperation 更改为 DISPOSE_ON_CLOSE,这将导致窗口在关闭时释放对 native 对等点的引用,并且当所有对等点都空闲时, JVM会自动退出

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MainFrame extends JFrame {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                newFrame();
                newFrame();
                newFrame();
            }
        });
    }

    public MainFrame() {
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setSize(800, 600);
        setVisible(true);
    }

    public static void newFrame() {
        new MainFrame();
    }

}

关于java - 当没有更多窗口打开时结束 Java AWT 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33600559/

相关文章:

java - 在 JFrame 上对齐 JButton 和 JLabel

java - JSP 字符串到 Java 类

Python3——突破包罗万象的 try block

java - jMonkey 和 Nifty 中的线程?

java - Kotlin CoroutineDispatcher 创建额外的线程而不是重新抛出 RejectedExecutionException

java - 使用 JOGL 调整 GLJPanel 的大小会导致我的模型消失

java - 是否可以选择在不禁用 CardLayout 的情况下添加 ScrollPane?

java - 谁真正实现了可序列化的方法?

java - 异常说明 "Resetting to invalid mark "在标记 inputStream 并重置它时出现,对于大文件。?

java - 如何从 eclipse 测试运行器中删除 Junit4