我有一个带有扩展的抽象类的应用程序JDialog
。类作为abstract void onClose()
,并且在类的构造函数中,添加了以下代码:
addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
onClose();
}
}
该事件在预期时被触发,但随后发生了一件奇怪的事情。当这个类的具体扩展有代码JDialog
在onClose()
方法中创建一个新的,并且 thisJDialog
的defaultCloseOperation
is JDialog.DISPOSE_ON_CLOSE
,事件被连续触发,直到我强制退出操作。
我已将代码隔离到以下 SSCCE:
// package removed
// imports removed
public class SSCCE extends JDialog {
public static void main(String[] args) {
SSCCE s = new SSCCE();
s.pack();
s.setVisible(true);
}
public SSCCE() {
setLayout(new GridLayout(1, 0, 0, 0));
JButton btn = new JButton("click me");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
dispose();
}
});
addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
System.out
.println("SSCCE.SSCCE().new WindowAdapter() {...}.windowClosed()");
onClose();
}
});
add(btn);
}
public void onClose() {
JDialog dialog = new JDialog();
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
}
}
单击“单击我”按钮后,空白JDialog
出现并SSCCE.SSCCE().new WindowAdapter() {...}.windowClosed()
出现在控制台窗口中。当我关闭空白对话框时,它再次出现并且文本再次出现。
另一个非常有趣的事情是,当我将初始化行从
JDialog dialog = new JDialog();
到
JDialog dialog = new JDialog() {
@Override
public synchronized void addWindowListener(WindowListener l) {
super.addWindowListener(l);
System.out
.println("SSCCE.onClose().new JDialog() {...}.addWindowListener()");
}
};
我在控制台中得到以下输出:
点击“点击我”按钮时:
SSCCE.SSCCE().new WindowAdapter() {...}.windowClosed()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
在对话框第一次关闭时:
SSCCE.SSCCE().new WindowAdapter() {...}.windowClosed()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
在对话框第二次关闭时:
SSCCE.SSCCE().new WindowAdapter() {...}.windowClosed()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
SSCCE.onClose().new JDialog() {...}.addWindowListener()
每次我关闭对话框时,都会再addWindowListener(WindowListener l)
调用一次,即使我不是故意调用它。
我真的不希望在对话框上注册任何 WindowListener
s,但我认为简单地覆盖addWindowListener(...)
方法而不调用super.addWindowListener(...)
会太草率。
我在 Mac OS X 10.6.8 上运行 Java 1.6.0_31,使用 Eclipse Indigo(如果重要的话,使用 WindowBuilder)。
有没有人有任何想法?
谢谢!