从JButton进程关闭JFrame保持活动状态

时间:2011-10-14 07:47:06

标签: java swing jvm jframe

我有一个用windowbuilderpro开发的类,我想从JButton关闭,而不是窗口上的标准X按钮,所以这里是类的例子:

public class MainWindow {

public JFrame frame;

public MainWindow() {
    initialize();
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  }

public void show() {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                //Show the main Frame
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }   
        }
    });
}

当我从X按钮关闭窗口时,窗口正确关闭,进程终止。

当我关闭具有此侦听器的JButton时:

mntmExit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
               //Close the application main form
               frame.setVisible(false);
               frame.dispose();
            }
        });

框架窗口正确关闭但过程仍然存在...为什么?

Process Alive

正如您所看到的,有一个AWT-Shutdown线程可以连续启动和终止,如何实现与关闭应用程序进程的X按钮相同的行为?

注意:

System.exit(0);是不适合的,因为它还会终止应用程序,如果有另一个后台运行线程,我不想这样做。 MainWindow类应该关闭并释放它的资源,这与使用关闭MainWindow实例的X按钮关闭应用程序的行为相同但是如果有后台线程运行它不会杀死它们但是等到它们完成工作...

环境:

  • JDK 7
  • Eclipse 3.7.1

3 个答案:

答案 0 :(得分:2)

x按钮或Exit按钮被激活时,此代码中的所有线程都会停止。你有不同的行为吗?

import java.awt.event.*;
import javax.swing.*;

public class MainWindow {

    public JFrame frame;
    JButton mntmExit = new JButton("Exit");

    public MainWindow() {
        frame = new JFrame("Close Me!");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        mntmExit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //Close the application main form
                frame.setVisible(false);
                frame.dispose();
            }
        });
        frame.add(mntmExit);
        frame.pack();
        show();
    }

    public void show() {
        //Show the main Frame
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                MainWindow mw = new MainWindow();
                mw.show();
            }
        });
    }
}

答案 1 :(得分:2)

不确定你真正需要什么,看起来你再次创建新的JFrame,不要这样做,创建一次JFrame并重新使用这个容器

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // do nothing

frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); // same as setVisible(false)

然后对于visibily,您只能致电frame.setVisible(true);

更多Confortable是覆盖WindowListener,那么你可以控制一些事件

答案 2 :(得分:-1)

只需添加一行:

System.exit(0);