如何在构建GUI时加载Swing时更新/绘制JProgressBar

Jes*_*sen 5 java swing event-dispatch-thread background-thread

我有一个GUI,它在运行它的平台上构建/初始化非常繁重.因此我想在初始化时更新进度..

我有一个小的未修饰的JDialog包含一个JLabel和一个JProgressBar,我想在初始化期间在特定的地方更新,但是,因为事件调度thead(根据Swing规则)用于构建/初始化GUI,进展当然是直到EDT再次空闲(即初始化完成)才更新..

JProgressBar我已经使用"paintImmediately"重绘了,但我似乎无法让它适用于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();

        }
    });
}
Run Code Online (Sandbox Code Playgroud)

只要EDT忙碌,并且在我们全部完成而不是一路更新之后,由progressBar.setValue()/ progressLabel.setText()上面的呼叫引起的重新绘制当然会排队等待.

tra*_*god 2

有可能constructSome*HeavyGUI()确实需要足够长的时间才能产生影响,但可能的是填充数据模型才是问题所在。相反,构建并显示空 GUI 元素并启动一个或多个SwingWorker实例来整理每个元素的数据。这里这里有相关的例子。

附录:如果问题是实例化组件,而不是加载数据模型,您可以将调用链接到invokeLater(),如下面评论中的建议。如果您要实例化那么多组件,请考虑享元模式JTable这是一个熟悉的例子。