java - Swing 应用程序和模态对话框的渲染问题

标签 java swing jdialog

我有一个 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/

相关文章:

Java ZipInputStream 异常在代码执行之前抛出

java - Android Studio 导入新模块时项目不会显示在项目结构中

java - 一个 JFrame 不会停止其他框架的代码

java - onToped JFrame 打开 JDialog = 对话框未覆盖 JFrame

java - 如何使用 jest 对 Elasticsearch 结果进行排序

java - 声明一堆相似变量的最少行数

java - 为什么创建 GridBagConstraints 的内联版本不起作用?

java - JComboBox 防止弹出窗口关闭

java - 在 java 中向 TableModel 添加 double 值

java - JDialog/OptionPane 带有带图标的大自定义按钮