在java / swing中关闭窗口时采取的正确操作是什么?

2022-09-04 01:51:46

我刚刚在我的CustomUIPanel类中编写了这个测试代码:

public static void main(String[] args) {
    final JDialog dialog = CustomUIPanel.createDialog(null, 
       CustomUIPanel.selectFile());
    dialog.addWindowListener(new WindowAdapter() {
        @Override public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });
}

如果是程序的入口点,它可以正常工作,但它让我想知道一些事情:如果另一个类要求测试怎么办?然后我的呼叫不正确。CustomUIPanel.main()CustomUIPanel.main()System.exit(0)

有没有办法告诉 Swing 事件调度线程在没有顶级窗口时自动退出?

如果不是,如果目标是让程序在所有顶级窗口关闭时退出,那么JDialog/JFrame在关闭时应该做什么?


答案 1

您可以使用 的 setDefaultCloseOperation() 方法,指定:JDialogDISPOSE_ON_CLOSE

setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

另请参见 12.8 程序退出

附录:结合@camickr有用的答案,此示例在关闭窗口或按下关闭按钮时退出。

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;

/** @see http://stackoverflow.com/questions/5540354 */
public class DialogClose extends JDialog {

    public DialogClose() {
        this.setLayout(new GridLayout(0, 1));
        this.add(new JLabel("Dialog close test.", JLabel.CENTER));
        this.add(new JButton(new AbstractAction("Close") {

            @Override
            public void actionPerformed(ActionEvent e) {
                DialogClose.this.setVisible(false);
                DialogClose.this.dispatchEvent(new WindowEvent(
                    DialogClose.this, WindowEvent.WINDOW_CLOSING));
            }
        }));
    }

    private void display() {
        this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        this.pack();
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new DialogClose().display();
            }
        });
    }
}

答案 2

不确定何时使用 JDialog。

但是当使用JFrame时,你应该使用frame.dispose()。如果该帧是最后一个打开的帧,则 VM 将退出。

请注意,对话框没有EXIT_ON_CLOSE选项,因为它通常不应退出 VM。

关闭对话框时,您始终可以获得对话框父框架。然后,您可以将事件调度到帧以告诉它自行关闭。像这样:

WindowEvent windowClosing = new WindowEvent(frame, WindowEvent.WINDOW_CLOSING);
//Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(windowClosing);
frame.dispatchEvent(windowClosing);

推荐