1

当我第一次开始 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();

现在,据我所知,您永远不应该从单独的线程创建或修改摆动组件。所有更新都必须在事件调度线程上执行。当然这适用于上面的代码?

维基百科上的 EDT

但是,上面的代码已经工作了。

但最近,出现了无数的重绘问题。例如,单击一个 JButton,然后调用 DialogModalVisibleThread 来显示一个对话框。它导致单击按钮旁边的按钮无法正确重绘。

重绘问题在我的机器上更常见,而不是其他开发人员的机器。另一位开发人员有一台笔记本电脑,其桌面扩展至 21 英寸显示器 - 显示器是他的主显示器。他运行的是 Java 版本 1.6.0_27 的 Windows 7。

我在装有 Windows 7 和 Java 版本 1.6.0_24 的笔记本电脑上运行。我有 2 个额外的显示器,我的桌面延伸到两个显示器上。

与此同时,我将升级到 Java 1.6 update 27。

我想知道上面的代码是否会导致重新绘制问题,或者还有其他人有相关的绘制问题吗?

有没有简单的方法来诊断这些问题?

谢谢

4

2 回答 2

4

因此,您正在违反规则,遇到问题,并想知道这些问题是否可能是由于您违反规则而引起的。答案是肯定的。尊重规则!

要检测违规行为,您可能会对以下页面感兴趣:http ://weblogs.java.net/blog/2006/02/16/debugging-swing-final-summary

于 2012-05-10T10:39:27.987 回答
2

检查您的问题是否是由违反规则引起的最简单方法是修复它们(无论如何您都应该修复它们:-)

只需从要更新到 UI 的线程中使用 SwingWorker.invokeLater() 即可轻松遵守 Swing 的合同。这样的事情应该可以解决问题:

@Override
public void run() {
    SwingUtilities.invokeLater(new Runnable() {
        jDialog.setVisible(true);
        jDialog.requestFocus();        
        }
    });
}

编辑:您应该将“jDialog”变量设为 final 才能正常工作。

于 2012-05-10T11:45:38.973 回答