Swing JDialog的bug?

问题描述 投票:1回答:2

我正在尝试通过扩展JDialog类来创建自己的对话框,这是我以前开始的代码:

import javax.swing.JDialog;

public class ColorManager extends JDialog {
    private static final long serialVersionUID = 1L;

    public ColorManager(){
        super();
        this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        this.pack();
        this.setVisible(true);
    }
}

当我尝试运行代码它工作正常但我得到以下异常:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: defaultCloseOperation must be one of: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, or DISPOSE_ON_CLOSE

我读到WINDOWS_EXIT或类似的问题,但我通过的参数应该做的工作。使它更奇怪的是,当我改变我的类,所以它将包含一个JDialog字段而不是扩展它,它似乎工作得很好。我让一个朋友在他的计算机上测试这个并且代码没有抛出异常,他正在使用jre版本1.6.022而我正在使用1.6.022我们两个都使用64位。

那我做错了什么?或者这是JRE中的错误?

编辑:忘了提,我正在使用eclipse Edit2:我在Netbeans中尝试了相同的代码,它运行正常,可能是我的问题?

java swing jdialog
2个回答
2
投票

您在构造函数中调用的所有方法都应该在EDT线程上调用。不建议在构造函数内部执行此操作,但如果您坚持确保它在Swing(EDT)线程上运行,例如:

import javax.swing.JDialog;

public class ColorManager extends JDialog {
    private static final long serialVersionUID = 1L;

    public ColorManager(){
        super();
         SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                this.pack();
                this.setVisible(true);
             }
         });
    }
}

IMO实现它的最佳方法是将其移动到单独的方法中,然后在创建qazxsw poi实例后调用它。

使用Swing时,您应始终遵守Swing线程规则。更多信息可以在

ColorManager


-1
投票

所有上述解决方案都很棒,我也有非常令人不安的时刻与http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html展示。

在NETBEAN 8.2上只需左键单击JDialog并选择属性,然后设置JFrame属性...通常是列表中的第一个,

defaultCloseOperation做同样的事情

......无论如何,这是我自己的经历

© www.soinside.com 2019 - 2024. All rights reserved.