我遇到自定义JDialog
的问题,它是由主框架在自己的线程中创建的。
有时JDialog
是不可见的,但它的控件是可点击的(如果你知道它们的位置在哪里)。问题不会发生在Oracle Java 1.7上,而是在Oracle Java 1.6上发生(在 1.6.0_37 和 1.6.0_45 中看到)。
我创建了这样的对话框:
class MyDialog extends Jdialog() {
public MyDialog(JFrame frame, boolean modal) {
super(frame, modal);
[...]
}
}
在我的大型机中:
MyDialog dialog = new MyDialog(myMainFrame,true);
dialog.setModalityType(Dialog.ModalityType.DOCUMENT_MODAL);
dialog.setVisible(true);
预期的行为是阻止大型机{{1}}之类的事件并将其置于其上。这完全适用于Java 1.7。
所以我的问题是,在创建MouseEvents
之后是否有任何特殊的事情要记住,只有在创建它之后,在父框架(所有者)可见之后或者它可能是使用过的Java JRE的已知错误?我已经检查了Oracle here的错误修复日志,但没有成功。
答案 0 :(得分:2)
“我有一个自定义JDialog的问题,由主框架在其自己的线程中创建”
如果那确实是真的,那就是问题。
您不应该在Event Dispatch Thread之外的任何其他线程上创建Swing对象的实例,尤其是 JComponent 。 Swing不完全是线程安全的,当你不完全确定你是在EDT上时,使用SwingUtilities.invokeAndWait()/ invokeLater()来执行GUI相关的代码。