加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 16:21:16 所属栏目:Java 来源:网络整理
导读:我在我的CustomUIPanel类中写了这个测试代码: public static void main(String[] args) { final JDialog dialog = CustomUIPanel.createDialog(null,CustomUIPanel.selectFile()); dialog.addWindowListener(new WindowAdapter() { @Override public void w
我在我的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在关闭时执行什么?

解决方法

您可以使用JDialog的 setDefaultCloseOperation()方法,指定DISPOSE_ON_CLOSE:
setDefaultCloSEOperation(JDialog.DISPOSE_ON_CLOSE);

参见12.8 Program Exit.

附录:结合@ 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 https://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();
            }
        });
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读