【发布时间】:2011-10-28 01:41:44
【问题描述】:
我有一个 GUI,它在运行它的平台上构建/初始化非常繁重。因此我想在它初始化时更新进度..
我有一个未装饰的小型 JDialog,其中包含一个 JLabel 和一个 JProgressBar,我想在初始化期间在特定位置更新它们,但是,因为事件调度 thead(根据 Swing 规则)用于构建/初始化 GUI,进度当然在 EDT 再次空闲(即初始化完成)之前不会更新..
我已经使用“paintImmediately”重绘了 JProgressBar,但我似乎无法让它对 JLabel 和对话框本身正常工作。有没有什么简单的推荐/经过验证的方法来完成这个?
干杯...
编辑:添加一个我正在尝试做的示例;当然,大大简化了。
private JLabel progressLabel;
private JProgressBar progressBar;
public static int main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
showProgressDialog();
progressLabel.setText("construct 1");
constructSomeHeavyGUI();
progressLabel.setText("construct 2");
progressBar.setValue(33);
constructSomeMoreHeavyGUI();
progressLabel.setText("construct 3");
progressBar.setValue(67);
constructEvenMoreHeavyGUI();
progressLabel.setText("done");
progressBar.setValue(100);
hideProgressDialog();
showHeavyGUI();
}
});
}
只要 EDT 忙,上面调用 progressBar.setValue()/progressLabel.setText() 引起的重绘当然会排队,并在我们全部完成后导致重绘,而不是一路更新..
【问题讨论】:
-
“大大简化了,当然” 要发布为回答者大大简化的代码,请发布SSCCE(当然)。
标签: java swing event-dispatch-thread background-thread