java7 swing 中使用 openjdk 1.7 的潜在错误。0_101

potential bug in java7 swing using openjdk 1.7.0_101

当使用 JDialog 的 dispose() 方法时,第一个 JDialog 关闭时我得到两个 windowClosed 事件,对于后续的 JDialog,我得到每个 先前关闭的 JDialog 的额外关闭事件(为新的 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

对话框将链接到它的所有者,如果在创建对话框时没有指定所有者,这会影响对话框的行为,如您所见。最好始终将您的对话与适当的所有者(或与正确转换的 null)相关联以获得最佳行为。