使用Swing App和模态对话框渲染问题

时间:2010-09-15 15:56:03

标签: java swing jdialog

我有一个Java / Swing桌面应用程序(Windows XP上的Java 6u16),用户偶尔会看到它挂起。我说似乎是因为实际上正在发生的是应用程序正在显示模式对话框但是此对话框未呈现。如果用户使用Alt-Tab切换远离应用程序,然后返回到该应用程序,则会正确呈现对话框。此外,如果远程用户通过NetOp(VNC /远程桌面工作)连接到会话,这也会导致GUI重新正确重绘。

该应用程序通过JavaWebstart运行。由于我听说过渲染问题是由DirectDraw引起的,所以我在JNLP中添加了以下内容

<property name="sun.java2d.noddraw" value="true"/>

但问题仍然存在(如果我理解正确,这将完全关闭DirectDraw和Direct3d:见http://download.oracle.com/javase/1.5.0/docs/guide/2d/flags.html#noddraw

我对这一点缺乏想法,我们将非常感谢任何建议。

谢谢,
菲尔

修改...

我有一个抽象的对话框类,它扩展了JDialog,并扩展了所有其他对话框。它包含以下方法:

public void showDialog() {      
    initKeyBindings();
    Application.getApplication().deactivateScannerListener();
    setVisible(true);
}

每当我想显示一个对话框时,我都会调用showDialog()。 initKeyBindings方法设置ActionMap,而第二行是特定于应用程序的(Application是单例,我在显示对话框时禁用JPOS扫描程序侦听器)。

有一个相应的hideDialog()方法如下:

public void hideDialog() {      
    setVisible(false);
    Application.getApplication().activateScannerListener();
    dispose();
}

谢谢, 菲尔

修改... 的 对此抱歉,还有一个编辑:所有对话框都有一个父对象。如果没有指定其他父级,AbstractDialog类将默认为主应用程序框架。

FYI 对于此后的任何人,我已将以下内容添加到我的代码中:

if (SwingUtilities.isEventDispatchThread()) {
        initialiseAndShowDialog();
} else {
    SwingUtilities.invokeAndWait(new Runnable() {
            @Override
            public void run() {
               initialiseAndShowDialog();
            }
    });
}

这确保了对话框仅从EDT打开。

1 个答案:

答案 0 :(得分:2)

您从哪个线程调用 showDialog()?应仅在Event Dispatch Thread上访问Swing组件。

您可以尝试 SwingUtilities.invokeAndWait() 传递给它的 Runnable 参数应该调用showDialog()。

如果它解决了问题,请告诉我们。