Java:如何有一个明确的JProgressBar来加载东西?

时间:2017-09-12 02:25:54

标签: java jprogressbar

好的,所以我理解如何无限期JProgressBars,但我不明白如何做明确的。例如,假设我使用JProgressBar表示我正在加载游戏。在加载这个游戏时,我有一些信息,我想从一些文件中加载信息并初始化变量:

private void load() {
    myInt = 5;
    myDouble = 1.2;
    //initialize other variables
}

并说我有4个文件要加载信息。如何对此进行翻译以提供100%的准确加载栏?

1 个答案:

答案 0 :(得分:0)

您需要在单独的线程中完成工作,并在工作进展时更新进度条的模型。

在Swing事件线程中执行模型更新非常重要,这可以通过使用SwingUtilities.invokeLater执行更新代码来完成。

例如:

public class Progress {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Loading...");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JProgressBar progressBar = new JProgressBar(0, 100);
        frame.add(progressBar);
        frame.pack();
        frame.setVisible(true);

        // A callback function that updates progress in the Swing event thread
        Consumer<Integer> progressCallback = percentComplete -> SwingUtilities.invokeLater(
            () -> progressBar.setValue(percentComplete)
        );

        // Do some work in another thread
        CompletableFuture.runAsync(() -> load(progressCallback));
    }

    // Example function that does some "work" and reports its progress to the caller
    private static void load(Consumer<Integer> progressCallback) {
        try {
            for (int i = 0; i <= 100; i++) {
                Thread.sleep(100);
                // Update the progress bar with the percentage completion
                progressCallback.accept(i);
            }
        } catch (InterruptedException e) {
            // ignore
        }
    }
}