当前位置:  开发笔记 > 编程语言 > 正文

为什么在调用setVisible(false)和dispose()时会调用Window/Component Listeners?

如何解决《为什么在调用setVisible(false)和dispose()时会调用Window/ComponentListeners?》经验,为你挑选了0个好方法。

我看到的区别是(在JDK 1.7上运行):

setVisible(false),调用componentHidden 调用windowClosed(API仅表示dispose()如此,即使它激怒了我也没关系)

dispose(),调用windowClosed不是 componentHidden

短期运行的示例代码(MCVE):

public class JDialogTest extends JDialog {
    private static final long serialVersionUID = 1L;

    public JDialogTest(JFrame owner){
        super(owner,ModalityType.APPLICATION_MODAL);
        init();
    }
    private void init() {
        this.getContentPane().setLayout(new GridLayout(1,2));
        JButton btnVisible = new JButton("Set visible false");
        btnVisible.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JDialogTest.this.setVisible(false);
            }
        });
        JButton btnDispose = new JButton("Dispose");
        btnDispose.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JDialogTest.this.dispose();
            }
        });
        this.getContentPane().add(btnVisible);
        this.getContentPane().add(btnDispose);
        this.pack();
    }

    public static void main(String[] args) {

        //A fake frame to test JDialog
        JFrame fakeFrame = new JFrame("Fake Frame");
        fakeFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fakeFrame.getContentPane().setLayout(new BorderLayout());
        JButton btnOpen = new JButton("Open Dialog");
        fakeFrame.getContentPane().add(btnOpen,BorderLayout.CENTER);
        fakeFrame.pack();
        fakeFrame.setLocationRelativeTo(null);

        //Generate the test dialog
        final JDialogTest dialog = new JDialogTest(fakeFrame);
        dialog.addComponentListener(new ComponentAdapter() {

            @Override
            public void componentShown(ComponentEvent e) {
                System.out.println("Component Shown");
            }
            @Override
            public void componentHidden(ComponentEvent e) {
                System.out.println("Component Hidden");
            }
        });

        dialog.addWindowListener(new WindowAdapter() {
            @Override
            public void windowOpened(WindowEvent e) {
                System.out.println("Window open");
            }
            @Override
            public void windowClosed(WindowEvent e) {
                System.out.println("Window closed");
            }
        });
        dialog.setLocationRelativeTo(null);

        btnOpen.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(true);
            }
        });
        fakeFrame.setVisible(true);
    }
}

注意:该示例具有a JDialog,但我看到相同的行为JFrame,测试简单地将侦听器附加到fakeFrame,并添加类似的按钮.(在MVCE中避免使其保持M inimal)).

我考虑过这篇文章:

JDialog setVisible(false)vs dispose()

在答案中似乎应该没有区别,使用dispose()...

API文档:

Window.setVisible(boolean b),Window.dispose(),ComponentListener.componentHidden(ComponentEvent e),WindowListener.windowClosed(WindowEvent e)

我为什么要关心:当然是出于好奇,而且因为我使用按钮来关闭窗口(调用dispose()),界面也可以通过顶部/右侧窗口关闭图标和alt+ F4(调用setVisible(false)!?)来关闭.因此,不能使用上述监听器中的任何一个.只有HierarchyListener会抓住他们两个,这似乎反直觉.

编辑:这个问题的范围是"为什么会这样"?目的是什么?".我预计dispose()用于调用!我找不到为什么不API文档中的任何线索.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有