为了账号安全,请及时绑定邮箱和手机立即绑定

如何从代码中关闭Java Swing应用程序

如何从代码中关闭Java Swing应用程序

波斯汪 2019-09-21 14:19:57
从代码终止Swing应用程序的正确方法是什么,陷阱是什么?我试图在计时器触发后自动关闭我的应用程序。但是,仅仅呼吁dispose()在JFrame没有做的伎俩-窗口消失了,但应用程序并没有终止。但是,当使用关闭按钮关闭窗口时,应用程序会终止。我该怎么办?
查看完整描述

3 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

您可以将JFrame的默认关闭操作设置为“ DISPOSE_ON_CLOSE”,而不是EXIT_ON_CLOSE(为什么人们继续使用EXIT_ON_CLOSE不在我的范围内)。

如果您有任何未处置的窗口或非守护进程线程,则您的应用程序不会终止。这应该被认为是一个错误(使用System.exit解决它是一个非常糟糕的主意)。

最常见的罪魁祸首是java.util.Timer和您创建的自定义线程。两者都应设置为守护程序或必须被明确杀死。

如果要检查所有活动帧,可以使用Frame.getFrames()。如果所有Windows /框架都已废弃,请使用调试器检查是否仍在运行任何非守护线程。


查看完整回答
反对 回复 2019-09-21
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

我猜是EXIT_ON_CLOSE


frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

before System.exit(0)更好,因为您可以在实际离开应用程序之前编写Window Listener进行一些清理操作。


该窗口侦听器允许您定义:


public void windowClosing(WindowEvent e) {

    displayMessage("WindowListener method called: windowClosing.");

    //A pause so user can see the message before

    //the window actually closes.

    ActionListener task = new ActionListener() {

        boolean alreadyDisposed = false;

        public void actionPerformed(ActionEvent e) {

            if (frame.isDisplayable()) {

                alreadyDisposed = true;

                frame.dispose();

            }

        }

    };

    Timer timer = new Timer(500, task); //fire every half second

    timer.setInitialDelay(2000);        //first delay 2 seconds

    timer.setRepeats(false);

    timer.start();

}


public void windowClosed(WindowEvent e) {

    //This will only be seen on standard output.

    displayMessage("WindowListener method called: windowClosed.");

}


查看完整回答
反对 回复 2019-09-21
?
温温酱

TA贡献1752条经验 获得超4个赞

可能安全的方法是这样的:


    private JButton btnExit;

    ...

    btnExit = new JButton("Quit");      

    btnExit.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e){

            Container frame = btnExit.getParent();

            do 

                frame = frame.getParent(); 

            while (!(frame instanceof JFrame));                                      

            ((JFrame) frame).dispose();

        }

    });


查看完整回答
反对 回复 2019-09-21
  • 3 回答
  • 0 关注
  • 1974 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信