我有一个 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/