好的,所以我理解如何无限期JProgressBars
,但我不明白如何做明确的。例如,假设我使用JProgressBar
表示我正在加载游戏。在加载这个游戏时,我有一些信息,我想从一些文件中加载信息并初始化变量:
private void load() {
myInt = 5;
myDouble = 1.2;
//initialize other variables
}
并说我有4个文件要加载信息。如何对此进行翻译以提供100%的准确加载栏?
答案 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
}
}
}