gpt4 book ai didi

java - JDialog 小程序在 Mac OSX 中未正确隐藏

转载 作者:行者123 更新时间:2023-12-01 16:09:37 25 4
gpt4 key购买 nike

我有一个小程序,它调用包含 JProgressBar 组件的 JDialog。我对 JDialog 进行子类化以公开更新 JProgressBar 的方法,例如:

public class ProgressDialog extends javax.swing.JDialog {
public void setProgress(double progress) {
jProgressBar1.setValue(jProgressBar1.getMinimum() + (int) (progress * jProgressBar1.getMaximum()));
}
...
}

我按以下方式使用此对话框:

public void test() throws Exception {
progressDialog = new ProgressDialog(null, true);

try {
progressDialog.setLocationRelativeTo(null);

// show the dialog
EventQueue.invokeLater(new Runnable() {
public void run() {
progressDialog.setVisible(true);
}
});

// business logic code that calls progressDialog.setProgress along the way
doStuff();

} finally {
progressDialog.setVisible(false);
progressDialog.dispose();
}
}

它在 Windows/任何浏览器上都能正常工作。但是,在Mac上的Firefox 2/3/3.5上调用上述函数时,progressDialog会无限期地显示,即不会关闭。

我怀疑在 EventQueue 内调用 setVisible(true) 导致了问题,因为它是一个阻塞调用,可能会完全阻塞队列,所以我尝试将其更改为:

        // show the dialog
new Thread() {
public void run() {
progressDialog.setVisible(true);
}
}.start();

通过此更改,progressDialog 现在可以正确关闭,但出现了一个新问题 - 对话框的内容(包括进度条、图标和用于显示消息字符串的 JLabel)不再显示在对话框内。仅在 Mac Firefox 上这仍然是一个问题。

有什么想法吗?我意识到这可能是一些 AWT 线程问题,但我已经研究了几天,但找不到好的解决方案。将 doStuff() 业务逻辑包装在单独的新线程中似乎可行,但将实际业务逻辑代码重构到单独的线程中并不容易,因此我希望有一个更简单的解决方案。

环境是:Mac OS X 10.5 java 1.5火狐2/3/3.5

最佳答案

发现问题是小程序函数在 AWT 调度程序线程内执行,因此线程会阻塞,并且在小程序函数完成执行之前不会处理任何事件。

解决方案是在调用 setVisible(true) 之前将处理逻辑移至由 ProgressDialog 对象生成的单独线程中。 setVisible(true) 会阻塞主线程,但仍允许事件调度程序继续处理,从而渲染对话框的内容,直到生成的线程调用 setVisible(false) 来隐藏对话框。

关于java - JDialog 小程序在 Mac OSX 中未正确隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1754135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com