我看到的区别是(在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文档中的任何线索.