使用openjdk 1.7.0_101在java7 swing中潜在的bug

时间:2016-08-12 17:10:46

标签: java swing debugging jdialog openjdk

当使用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
  • 受影响的版本:OpenJDK 1.7.0_101,但不是OpenJDK 1.8.0_91
  • 受JRE影响但不受Javac影响

1 个答案:

答案 0 :(得分:1)

对话框将链接到其所有者,如果在创建对话框时没有给出所有者,则会影响对话框的行为,如您所见。最好始终将对话框与适当的所有者(或使用良好的空值)关联起来,以获得最佳行为。