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
- 受影响的版本:OpenJDK 1.7.0_101,但不影响 OpenJDK 1.8.0_91
- 受 JRE 影响但不受 Javac 影响
对话框将链接到它的所有者,如果在创建对话框时没有指定所有者,这会影响对话框的行为,如您所见。最好始终将您的对话与适当的所有者(或与正确转换的 null)相关联以获得最佳行为。
当使用 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
- 受影响的版本:OpenJDK 1.7.0_101,但不影响 OpenJDK 1.8.0_91
- 受 JRE 影响但不受 Javac 影响
对话框将链接到它的所有者,如果在创建对话框时没有指定所有者,这会影响对话框的行为,如您所见。最好始终将您的对话与适当的所有者(或与正确转换的 null)相关联以获得最佳行为。