Java Swing JDialog bug?
我试图通过扩展JDialog类来创建自己的对话框 这是我用来启动的代码:Java Swing JDialog bug?,java,swing,jdialog,Java,Swing,Jdialog,我试图通过扩展JDialog类来创建自己的对话框 这是我用来启动的代码: import javax.swing.JDialog; public class ColorManager extends JDialog { private static final long serialVersionUID = 1L; public ColorManager(){ super(); this.setDefaultCloseOperation(JDia
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\u EXIT或类似的东西有问题,但我传递的参数应该可以完成这项工作。
更奇怪的是,当我改变我的类,使它包含一个JDialog
字段而不是扩展它时,它似乎工作得很好。
我请一位朋友在他的计算机上测试这个,代码没有抛出异常,他使用的是jre版本1.6.022,我使用的是1.6.022,我们都使用64位
那么我做错了什么?或者这是JRE中的一个bug
编辑:忘了提到,我正在使用eclipseEdit2:我在Netbeans中尝试了相同的代码,效果很好,我的问题是什么???在构造函数中调用的所有方法都应该在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);
}
});
}
}
在我看来,实现这一点的最佳方法是将其移动到单独的方法中,然后在创建ColorManager
实例后调用它
使用Swing时,应始终遵守Swing线程规则。有关更多信息,请访问
在构造函数中调用的所有方法都应该在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);
}
});
}
}
在我看来,实现这一点的最佳方法是将其移动到单独的方法中,然后在创建ColorManager
实例后调用它
使用Swing时,应始终遵守Swing线程规则。有关更多信息,请访问
以上所有的解决方案都很好,我在显示
JDialog
时也遇到了非常令人不安的时刻
在NETBEAN 8.2上,只需左键单击JFrame
并选择properties,然后设置defaultCloseOperation
属性。。。通常排在第一位
对JDialog执行相同的操作
。。。无论如何,这是我自己的经验以上所有的解决方案都很棒,我在展示JDialog
时也有过非常令人不安的时刻
在NETBEAN 8.2上,只需左键单击JFrame
并选择properties,然后设置defaultCloseOperation
属性。。。通常排在第一位
对JDialog执行相同的操作
。。。无论如何,这是我自己的经验请包括异常的整个堆栈跟踪。根据我自己在程序中遇到的bug,这是Java中的bug的可能性很低。代码中存在bug的可能性非常高,数量级更高。我建议你创建并发布一个bug,这样我们就可以自己测试和修改代码了。同样,SSCCE将为您提供快速完整解决方案的最佳选择。好的,我想我发现了我做错了什么。我将代码粘贴到一个新项目中并对其进行了测试,同样的事情也发生了,然后我创建了一个创建对话框的主函数,它现在可以正常工作了。我想,当我尝试在没有main的情况下运行它,只是为了查看对话框时,它会尝试将其作为java Bean运行,而导致异常的原因我想,谢谢你的帮助,请包括异常的整个堆栈跟踪。根据我自己在程序中遇到的错误,这是java中的错误的可能性很低。代码中存在bug的可能性非常高,数量级更高。我建议你创建并发布一个bug,这样我们就可以自己测试和修改代码了。同样,SSCCE将为您提供快速完整解决方案的最佳选择。好的,我想我发现了我做错了什么。我将代码粘贴到一个新项目中并对其进行了测试,同样的事情也发生了,然后我创建了一个创建对话框的主函数,它现在可以正常工作了。我想,当我尝试在没有main的情况下运行它,只是为了查看对话框时,它会尝试将其作为javabean运行,我想这就是导致异常的原因,谢谢您的帮助