如何关闭 JDialog 并通知窗口事件侦听器?
有没有办法通过代码关闭 JDialog,以便窗口事件侦听器仍会收到通知?我尝试过将可见设置为虚假和处置,但似乎都没有这样做。
有没有办法通过代码关闭 JDialog,以便窗口事件侦听器仍会收到通知?我尝试过将可见设置为虚假和处置,但似乎都没有这样做。
关闭窗口(with )和隐藏它(with )是不同的操作,并产生不同的事件 - 从操作系统关闭它是另一个不同的操作,产生不同的事件。dispose()
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()
HierarchyListener
window.addHierarchyListener(new HierarchyListener() {
@Override
public void hierarchyChanged(HierarchyEvent e) {
System.out.println("valid: " + window.isValid());
System.out.println("showing: " + window.isShowing());
}
});
请注意,当您释放窗口时,您将获得几个窗口,首先是隐藏,然后是无效,但是当您隐藏它时,它仍然有效,因此您不会获得无效。HierarchyEvent
setVisible()
我似乎没有你的问题。当我使用下面的代码时,windowDeactivated()被调用为setVisible(false)或dispose(),windowClosed()也被调用为dispose()。
结束对话框.java:
public class ClosingDialog extends JDialog {
public ClosingDialog(Frame owner, String title, boolean modal) {
super(owner, title, modal);
JPanel contentPanel = (JPanel) this.getContentPane();
JButton setVisButton = new JButton("setVisible( false )");
setVisButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ClosingDialog.this.setVisible(false);
}
});
JButton disposeButton = new JButton("dispose()");
disposeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ClosingDialog.this.dispose();
}
});
contentPanel.setLayout(new FlowLayout());
contentPanel.add(setVisButton);
contentPanel.add(disposeButton);
this.addWindowListener(new WindowListener() {
public void windowActivated(WindowEvent e) {
System.out.println("windowActivated");
}
public void windowClosed(WindowEvent e) {
System.out.println("windowClosed");
}
public void windowClosing(WindowEvent e) {
System.out.println("windowClosing");
}
public void windowDeactivated(WindowEvent e) {
System.out.println("windowDeactivated");
}
public void windowDeiconified(WindowEvent e) {
System.out.println("windowDeiconified");
}
public void windowIconified(WindowEvent e) {
System.out.println("windowIconified");
}
public void windowOpened(WindowEvent e) {
System.out.println("windowOpened");
}
});
this.setSize(300, 300);
}
}