Java线程安全v从单独的线程显示对话框

时间:2012-05-10 10:26:51

标签: multithreading swing repaint

我第一次启动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组件。必须在事件调度线程上执行所有更新。当然这适用于上面的代码吗?

EDT on WikiPedia

但是,上面的代码已经奏效了。

但最近,有无数重复的问题。例如,单击JButton然后调用DialogModalVisibleThread以显示对话框。它导致单击按钮旁边的按钮不能正确重绘。

重新绘制问题在我的机器上更频繁,而不是其他开发人员机器。另一位开发人员将笔记本电脑的桌面扩展到21英寸显示器 - 显示器是他的主要显示器。他运行的是Windows 7,版本为1.6.0_27。

我在使用Windows 7和Java版本1.6.0_24的笔记本电脑上运行。我有两个额外的显示器,我的桌面扩展到两个。

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

我想知道上面的代码是否会导致重绘问题,还是有其他人在那里有相关的油漆问题?

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

由于

2 个答案:

答案 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'变量最终成功。