我想使用进度监视器在真正复杂的对话开始时显示进度!!!
对话框创建在事件调度程序线程中完成。最长可能需要10秒钟,具体取决于客户端系统。
我希望在前台看到一个进度监视器,它显示每个当前加载部件的状态。与此同时,Dialog正在后台建立。
问题是进度监视器总是冻结,直到对话框启动。对话框启动完成后,progressmonitor会做出反应并显示当前状态。
我在论坛中尝试了很多东西,但没有两个不同的线程它不起作用。下面是让进度监视器和对话框创建在EDT中运行的示例。
final CVProgressMonitorDialog progressMonitor = new CVProgressMonitorDialog();
progressMonitor.startPollingThread();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
startComplexDialog();
}
finally {
close(progressMonitor);
}
}
});
CVProgressMonitorDialog主要是随swing摆放的ProgressMonitor。
解决方案是让对话框的创建在另一个线程中运行。
final CVProgressMonitorDialog progressMonitor = new CVProgressMonitorDialog();
progressMonitor.startPollingThread();
new Thread() {
@Override
public void run() {
try {
startComplexDialog();
}
finally {
close(progressMonitor);
}
}
}.start();
使用第二种解决方案会导致潜在的麻烦,因为摆动不是线程安全的吗? 在EDT内是否有监控任务的一般解决方案?
答案 0 :(得分:1)
你说:
对话框创建在事件调度程序线程中完成。最长可能需要10秒,具体取决于客户端系统。
还有你的问题。您需要在后台线程中运行任何非Swing长时间运行的代码,例如SwingWorker提供的代码,但要注意确保在事件线程上完成任何更改可见Swing组件状态的代码。 / p>
我希望在前台看到一个进度监视器,它显示每个当前加载部件的状态。与此同时,Dialog正在后台建立。
再次,在SwingWorker派生的后台线程中工作,在创建过程中更新SwingWorker的progress属性,并使用添加到SwingWorker的PropertyChangeListener来监视并显示对进度的更改。
答案 1 :(得分:0)
如另一个答案所述,你不应该在EDT中进行冗长的操作。但是,如果你赶时间,我使用模态JDialog管理类似的情况。当模态对话框可见时,它将阻止进行setVisible(true)调用的线程并获得它自己的调度线程。它可以独立于EDT更新。你的进度条就在其中一个中,它应该没问题。