当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何从代码中关闭JavaSwing应用程序》经验,为你挑选了5个好方法。

从代码中终止Swing应用程序的正确方法是什么,有哪些陷阱?

我试图在计时器启动后自动关闭我的应用程序.但是,仅仅呼吁dispose()JFrame没有做的伎俩-窗口消失了,但应用程序并没有终止.但是,当使用关闭按钮关闭窗口时,应用程序会终止.我该怎么办?



1> James Schek..:

您的JFrame默认关闭操作可以设置为" DISPOSE_ON_CLOSE"而不是EXIT_ON_CLOSE(为什么人们继续使用EXIT_ON_CLOSE超出我的范围).

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

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

如果要检查所有活动帧,可以使用Frame.getFrames().如果处理掉所有Windows /帧,则使用调试器检查仍在运行的任何非守护程序线程.


使用EXIT_ON_CLOSE将强制终止应用程序.如果您需要在程序退出之前采取措施(例如保存工作数据),那么您必须使用JVM事件处理程序而不是仅使用正常的swing事件处理程序.两者都"有效",但EXIT_ON_CLOSE会导致更复杂的应用程序出现问题.

2> VonC..:

我想一个EXIT_ON_CLOSE

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

之前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.");
}



3> Daniel Spiew..:

尝试:

System.exit(0);

原油,但有效.


System.exit(0)不只是原始的,它是邪恶的.检查所有帧,呼叫处理.如果失败,请运行调试器并查看哪些非守护程序线程仍处于活动状态.

4> Kachwahed..:

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

    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();
        }
    });


用大写字母命名变量`Frame`非常糟糕的样式,就像类的名字一样......

5> 小智..:

以下程序包括将在没有显式调用System.exit()的情况下终止缺少无关线程的程序的代码.为了将此示例应用于使用线程/侦听器/定时器/等的应用程序,只需要在actionPerformed()中手动启动WindowEvent之前插入清除代码请求(以及,如果适用,等待)它们的终止.

对于那些希望复制/粘贴能够完全按照所示运行的代码的人来说,最后会包含一个稍微丑陋但不相关的主要方法.

public class CloseExample extends JFrame implements ActionListener {

    private JButton turnOffButton;

    private void addStuff() {
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        turnOffButton = new JButton("Exit");
        turnOffButton.addActionListener(this);
        this.add(turnOffButton);
    }

    public void actionPerformed(ActionEvent quitEvent) {
        /* Iterate through and close all timers, threads, etc here */
        this.processWindowEvent(
                new WindowEvent(
                      this, WindowEvent.WINDOW_CLOSING));
    }

    public CloseExample() {
        super("Close Me!");
        addStuff();
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                CloseExample cTW = new CloseExample();
                cTW.setSize(200, 100);
                cTW.setLocation(300,300);
                cTW.setVisible(true);
            }
        });
    }
}

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有