当使用JDialog的dispose()方法时,我为第一个JDialog关闭了两个windowClosed事件,对于后续的JDialogs,我为每个以前关闭的JDialogs 获得了一个额外的关闭事件(另外两个用于新的JDialog)。
我的代码中有什么问题(在下面发布)?
package main;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JButton;
import javax.swing.JDialog;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
JDialog dialog;
while (true)
{
dialog = createDialog();
while (dialog.isVisible())
{
Thread.sleep(10);
}
}
}
public static JDialog createDialog()
{
final JDialog dialog = new JDialog();
JButton close = new JButton("Close");
dialog.add(close);
final WindowListener windowListener = new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
System.err.println("windowOpened " + dialog.hashCode());
}
@Override
public void windowIconified(WindowEvent e) {
System.err.println("windowIconified " + dialog.hashCode());
}
@Override
public void windowDeiconified(WindowEvent e) {
System.err.println("windowDeiconified " + dialog.hashCode());
}
@Override
public void windowDeactivated(WindowEvent e) {
System.err.println("windowDeactivated " + dialog.hashCode());
}
@Override
public void windowClosing(WindowEvent e) {
System.err.println("windowClosing " + dialog.hashCode());
}
@Override
public void windowClosed(WindowEvent e) {
System.err.println("windowClosed " + dialog.hashCode());
// uncommenting this provides a fix to the bug
// dialog.removeWindowListener(this);
}
@Override
public void windowActivated(WindowEvent e) {
System.err.println("windowActivated " + dialog.hashCode());
}
};
close.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e) {
dialog.setVisible(false);
dialog.dispose();
}
});
dialog.addWindowListener(windowListener);
dialog.pack();
dialog.setVisible(true);
return dialog;
}
}
关闭一个JDialog框后此代码的示例输出:
windowOpened 1479616934
windowActivated 1479616934
windowDeactivated 1479616934
windowClosed 1479616934
windowClosed 1479616934
windowOpened 1514973352
windowActivated 1514973352
关闭第二个JDialog框后的示例输出:
windowClosed 1514973352
windowClosed 1479616934
windowClosed 1514973352
windowOpened 78938440
windowActivated 78938440
答案 0 :(得分:1)
对话框将链接到其所有者,如果在创建对话框时没有给出所有者,则会影响对话框的行为,如您所见。最好始终将对话框与适当的所有者(或使用良好的空值)关联起来,以获得最佳行为。