1

我有一个 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,而第二行是特定于应用程序的(应用程序是一个单例,我在显示对话框时禁用了 JPOS 扫描程序侦听器)。

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

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

谢谢,菲尔

编辑... 对不起,再编辑一个:所有对话框都有一个父级。如果未指定其他父级,则 AbstractDialog 类将默认为主应用程序框架。

仅供参考对于任何关注此内容的人,我已将以下内容添加到我的代码中:

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

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

4

1 回答 1

2

Which thread are you calling showDialog() from? Swing components should be accessed on the Event Dispatch Thread only.

You could try SwingUtilities.invokeAndWait() and the Runnable argument passed to it should call showDialog().

Let us know if it fixed the problem.

于 2010-09-15T18:02:14.167 回答