有没有办法通过代码关闭JDialog,以便仍然会通知Window事件监听器?我试过将可见设置为假和处理,但似乎都没有.
关闭一个窗口(with dispose()
)并将其隐藏(with setVisible(false)
)是不同的操作,并产生不同的事件 - 从操作系统关闭它是另一个产生不同事件的不同操作.
所有这三个都会产生windowDeactivated
告诉你窗口失去焦点,但dispose()
随后会产生windowClosed
,而从操作系统关闭将首先产生windowClosing
.如果要以相同的方式处理这两种方法,可以将窗口设置为在关闭时处理:
window.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
通常,setVisible(false)
暗示您可能希望再次使用该窗口,因此它不会发布任何窗口事件(除此之外windowDeactivated
).如果要检测窗口的隐藏,则需要使用ComponentListener
;
window.addComponentListener(new ComponentAdapter() { @Override public void componentHidden(ComponentEvent e) { System.out.println("componentHidden()"); } })
请注意,这几乎只适用于显式setVisible()
调用.如果你需要更普遍地检测隐藏,你可以使用a HierarchyListener
,但它可能比它的价值更麻烦.
window.addHierarchyListener(new HierarchyListener() { @Override public void hierarchyChanged(HierarchyEvent e) { System.out.println("valid: " + window.isValid()); System.out.println("showing: " + window.isShowing()); } });
请注意,当你处理一个窗口时,你会得到几个HierarchyEvent
s,首先是隐藏然后是为了失效,但是当你隐藏它时setVisible()
它仍然有效,所以你不会得到失效.