我有一个 Java/Swing 桌面应用程序(Windows XP 上的 Java 6u16),用户有时会发现它挂起。我说似乎是因为实际上发生的情况是应用程序正在显示模式对话框,但该对话框并未被渲染。如果用户使用 Alt-Tab 离开应用程序然后返回到应用程序,则对话框将正确呈现。此外,如果远程用户通过 NetOp(类似于 VNC/远程桌面)连接到 session ,这也会导致 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 打开。
最佳答案
您从哪个线程调用 showDialog()? Swing 组件只能在事件调度线程上访问。
你可以尝试SwingUtilities.invokeAndWait() 并且传递给它的 Runnable 参数应该调用 showDialog()。
请告诉我们是否解决了问题。
关于java - Swing 应用程序和模态对话框的渲染问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3719484/