Java 为什么windowClosed没有被调用?

Java 为什么windowClosed没有被调用?,java,swing,user-interface,Java,Swing,User Interface,我有一个问题,为什么在我的测试代码中没有调用“windowClosed”方法,如下所示 import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; public class Tmp { class TFrame extends JFrame{ private static final long serialVersionUID =

我有一个问题,为什么在我的测试代码中没有调用“windowClosed”方法,如下所示

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;

public class Tmp {

    class TFrame extends JFrame{
        private static final long serialVersionUID = -5729542298504858399L;

        public TFrame() {
            setTitle("title");
            setSize(300, 300);
        }
    }


    public static void main(String[] args) {
        final TFrame t = new Tmp().new TFrame();
        t.addWindowStateListener(new WindowAdapter() {
            @Override
            public void windowStateChanged(WindowEvent e) {
                super.windowStateChanged(e);
                System.out.println(e.getOldState() + "<-old new->" + e.getNewState());
            }
        });
        t.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosed(WindowEvent e) {
                super.windowClosed(e);
                System.out.println(e.getID() + "closed " + e.getNewState());
            }

            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                System.out.println(e.getID() + "closing" + e.getNewState());
            }
        });
        t.setVisible(true);
    }
}

setDefaultCloseOperation
的默认值是
HIDE\u ON\u CLOSE
。这样,窗口不会关闭,只会隐藏


将该值更改为其他值,可以让它实际关闭,而不仅仅是隐藏它,因此事件将被触发。

感谢您的回答,我检查了JFrame.java中的setDefaultCloseOperation(..),它告诉您发布的内容:-)。我想提出的另一件事是,如果我希望调用windowClosed(),我是否应该始终使用“DISPOSE\u ON\u CLOSE”作为参数?如果能提供一些不错的属性指南/代码片段就太好了。这取决于上下文。例如,如果您想在关闭前向用户询问一些问题,您必须将其设置为DO_NOTHING_ON_CLOSE和ON windowClosing为用户显示问题,然后处理()窗口。我明白了,我根据您的建议编写了一个快速演示,这是正确的实现方式吗?请看更新后的帖子:-)它看起来是正确的,只是你可能不需要其他部分。我不得不说,我不喜欢这里的JRE命名。HIDE_ON_CLOSE表示关闭窗口会隐藏窗口。也就是说你确实关上了窗户。也就是说,您通常希望windowClosed被解雇!似乎很难理解,只有在关闭的情况下进行处理才会使窗户关闭。它被记录在某处,但命名肯定是模棱两可的。
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Tmp {

    class TFrame extends JFrame {
        // ignored .....
        t.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosed(WindowEvent e) {
                super.windowClosed(e);
                System.out.println(e.getID() + "closed " + e.getNewState());
            }

            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                System.out.println(e.getID() + "closing" + e.getNewState());
                int quit = JOptionPane.showConfirmDialog(t, "Are you sure to quit?");
                if(quit == JOptionPane.YES_OPTION){
                    t.dispose();
                }
                else if (quit == JOptionPane.NO_OPTION){
                    t.setVisible(false);
                }
            }
        });
        t.setVisible(true);
        t.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    }
}