关于Java WindowListener的问题

关于Java WindowListener的问题,java,swing,Java,Swing,如果您有一个WindowListener,则无论何时关闭窗口,都会发生windowDeactivated(WindowEvent)事件,还是可以在不发生windowDeactivated(WindowEvent)的情况下发生windowClosing(WindowEvent)事件。也就是说,车窗关闭是否是车窗关闭的一部分 最后,windowClosed(WindowEvent)是否总是(通常)跟随windowClosed(WindowEvent)?假设结果似乎取决于setDefaultClose

如果您有一个
WindowListener
,则无论何时关闭窗口,都会发生
windowDeactivated(WindowEvent)
事件,还是可以在不发生
windowDeactivated(WindowEvent)
的情况下发生
windowClosing(WindowEvent)
事件。也就是说,车窗关闭是否是车窗关闭的一部分

最后,
windowClosed(WindowEvent)
是否总是(通常)跟随
windowClosed(WindowEvent)

假设结果似乎取决于
setDefaultCloseOperation()
;要关闭
窗口
事件,需要“在窗口上调用dispose”,如前所述,例如通过
dispose\u on\u CLOSE

导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.event.WindowAdapter;
导入java.awt.event.WindowEvent;
导入java.util.Random;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
/**@见http://stackoverflow.com/questions/2141325 */
公共类MyPanel扩展了JPanel{
私有静态最终随机RND=新随机();
私有静态最终WindowAdapter侦听器=新WindowAdapter(){
@凌驾
公共无效窗口关闭(WindowEvent e){
印刷品(e);
}
@凌驾
公共无效窗口关闭(WindowEvent e){
印刷品(e);
}
@凌驾
公共无效窗口已停用(WindowEvent e){
印刷品(e);
}
私有作废打印(WindowEvent e){
System.out.println(e.getWindow().getName()+“:”+e);
}
};
公共事务委员会(){
这个.setBackground(新颜色(RND.nextInt());
}
@凌驾
公共维度getPreferredSize(){
返回新尺寸(320240);
}
私有静态void create(){
对于(int i=0;i<2;i++){
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f、 setTitle(String.valueOf(i));
f、 添加(新的MyPanel());
f、 addWindowListener(监听器);
f、 包装();
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
创建();
}
});
}
}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/2141325 */
public class MyPanel extends JPanel {

    private static final Random RND = new Random();
    private static final WindowAdapter listener = new WindowAdapter() {

        @Override
        public void windowClosed(WindowEvent e) {
            print(e);
        }

        @Override
        public void windowClosing(WindowEvent e) {
            print(e);
        }

        @Override
        public void windowDeactivated(WindowEvent e) {
            print(e);
        }

        private void print(WindowEvent e) {
            System.out.println(e.getWindow().getName() + ":" + e);
        }
    };

    public MyPanel() {
        this.setBackground(new Color(RND.nextInt()));
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(320, 240);
    }

    private static void create() {
        for (int i = 0; i < 2; i++) {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setTitle(String.valueOf(i));
            f.add(new MyPanel());
            f.addWindowListener(listener);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                create();
            }
        });
    }
}