我第一次启动Java编程时,注意到我们的应用程序中有一些代码。我注意到它从一个单独的线程创建了一个对话框,但从未打过眼罩,因为它“似乎工作”。然后我通过我的代码将此方法包装起来以显示对话框。
具体如下:
public class DialogModalVisibleThread
extends Thread {
private JDialog jDialog;
public DialogModalVisibleThread(JDialog dialog, String dialogName) {
this.setName("Set " + dialogName + " Visable");
jDialog = dialog;
}
@Override
public void run() {
jDialog.setVisible(true);
jDialog.requestFocus();
}
}
用法:
WarnUserDifferenceDialog dialog = new WarnUserDifferenceDialog( _tableDifferenceCache.size() );
DialogModalVisibleThread dmvt = new DialogModalVisibleThread( dialog, "Warn User About Report Diffs");
dmvt.start();
现在,据我所知,您永远不应该从单独的线程创建或修改swing组件。必须在事件调度线程上执行所有更新。当然这适用于上面的代码吗?
但是,上面的代码已经奏效了。
但最近,有无数重复的问题。例如,单击JButton然后调用DialogModalVisibleThread以显示对话框。它导致单击按钮旁边的按钮不能正确重绘。
重新绘制问题在我的机器上更频繁,而不是其他开发人员机器。另一位开发人员将笔记本电脑的桌面扩展到21英寸显示器 - 显示器是他的主要显示器。他运行的是Windows 7,版本为1.6.0_27。
我在使用Windows 7和Java版本1.6.0_24的笔记本电脑上运行。我有两个额外的显示器,我的桌面扩展到两个。
与此同时,我将升级到Java 1.6 update 27.
我想知道上面的代码是否会导致重绘问题,还是有其他人在那里有相关的油漆问题?
有没有简单的方法来诊断这些问题?
由于
答案 0 :(得分:4)
所以,你违反规则,遇到问题,并想知道这些问题是否可能是因为你违反了规则。答案是肯定的。尊重规则!
要检测违规行为,您可能会对以下页面感兴趣:http://weblogs.java.net/blog/2006/02/16/debugging-swing-final-summary
答案 1 :(得分:2)
检查问题是否是由违反规则引起的最简单方法是修复它们(无论如何应该修复它们: - )
只需从要更新到UI的线程中使用SwingWorker.invokeLater()即可轻松遵守Swing的合同。这样的事情可以解决问题:
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
jDialog.setVisible(true);
jDialog.requestFocus();
}
});
}
编辑:你应该让'jDialog'变量最终成功。