Java实现窗口退出确认框,确认框取消按钮问题

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/qq_41979349/article/details/83040613

在Java学习GUI时难免会遇到点击框架退出时需要弹出确认提示框的需求,废话不多说,直接上代码,下面是主程序,MenuFrame是继承JFame的类

public class Test_19 {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            MenuFrame frame = new MenuFrame();
            //不执行任何操作;要求程序在已注册的 WindowListener 对象的 windowClosing 方法中处理该操作
            frame.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    int result = JOptionPane.showConfirmDialog(null, "确认退出?", "确认", 							JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
                    if(result == JOptionPane.OK_OPTION){
                        System.exit(0);
                    }
                }
            });
            frame.setTitle("第二次作业");
            frame.setVisible(true);
        });

    }
}

代码是挺短的,逻辑也很简单,首先为frame添加了一个监听窗口事件的方法addWindowListener,然后使用了匿名内部类的方法,,将WindowAdapter的对象传给这个方法,然后在匿名类中重写了windowClosing的方法,接着在方法里面显示了确认的对话框,对确认按钮进行监听,并实现退出。

上面代码亲测有效,不过有些坑我觉得还是得提出来,有些人可能会碰到某些问题,能够弹出确认框,但点击取消按钮后还是退出了程序,其实程序并没有结束,只是被隐藏了起来,如何解决呢?

网上很多做法是直接删去下面这行代码:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

这句代码是默认会结束程序,但我尝试后并没有解决问题,后来看来某百度知道才终于解决了问题

JFrame的关闭不像Frame,点关闭按钮自己会关闭,但是那样做不好.可以用setDefaultCloseOperation(int operation);其中operation有以下几种:
DO_NOTHING_ON_CLOSE(在 WindowConstants 中定义):不执行任何操作;要求程序在已注册的 WindowListener 对象的 windowClosing 方法中处理该操作。
HIDE_ON_CLOSE(在 WindowConstants 中定义):调用任意已注册的 WindowListener 对象后自动隐藏该窗体。
DISPOSE_ON_CLOSE(在 WindowConstants 中定义):调用任意已注册 WindowListener 的对象后自动隐藏并释放该窗体。
EXIT_ON_CLOSE(在 JFrame 中定义):使用 System exit 方法退出应用程序。仅在应用程序中使用。
默认情况下,该值被设置为 HIDE_ON_CLOSE。更改此属性的值将导致激发属性更改事件,其属性名称为 “defaultCloseOperation”。

于是将setDefaultCloseOperation(int operation)的值更改为DO_NOTHING_ON_CLOSE后解决问题

frame.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

猜你喜欢

转载自blog.csdn.net/qq_41979349/article/details/83040613