【问题标题】:Why is windowClosed not being called?为什么没有调用 windowClosed?
【发布时间】:2012-11-07 07:18:20
【问题描述】:

我有一个问题,为什么在我的测试代码中没有调用“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(JFrame.DISPOSE_ON_CLOSE) 或显式调用 dispose() 到 TFrame,windowClosed() 将被调用。

是否有人可以更详细地解释它,我很困惑为 windowClosed() 编写侦听器的属性方式是什么,在此先感谢。

////////////////// updated according to some guides from Dan //////////////

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

【问题讨论】:

    标签: java swing user-interface


    【解决方案1】:

    setDefaultCloseOperation 的默认值为HIDE_ON_CLOSE。有了这个,窗口没有关闭,它只是隐藏。

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

    【讨论】:

    • 感谢您的回答,我检查了 JFrame.java 中的 setDefaultCloseOperation(..),它告诉您发布的内容:-)。我想提出的另一件事是,如果我想调用 windowClosed(),我应该始终使用“DISPOSE_ON_CLOSE”作为参数吗?如果能给出一些不错的属性指南/代码sn-p,那就太好了。
    • 这取决于上下文。例如,如果您希望用户在关闭之前被询问某些内容,则必须将其设置为 DO_NOTHING_ON_CLOSE 并在 windowClosing 时为用户显示问题,然后 dispose() 窗口。
    • 我明白了,我根据你的建议写了一个快速演示,它是正确的实现方式吗?请查看更新后的帖子:-)
    • 它看起来是正确的,除了你可能不需要 else 部分。
    • 我不得不说,我不喜欢这里的 JRE 命名。 HIDE_ON_CLOSE 意味着关闭窗口会隐藏窗口。也就是说,您确实关闭了窗口。也就是说,您通常会期望 windowClosed 被解雇!只有 DISPOSE_ON_CLOSE 会触发 windowClosed 似乎非常模糊。它被记录在某处,但命名肯定是模棱两可的。
    猜你喜欢
    • 2012-04-06
    • 2012-08-11
    • 2011-10-27
    • 2020-07-19
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多