通过javaFX中的线程更新ProgressBar
Updating ProgressBar through thread in javaFX
我正在开发一个使用 JavaFX 的 ProgressBar 的 Java 项目。从我在Whosebug上发现的,通常需要添加一个线程,或者程序需要实现Runnable,以便动态更新ProgressBar的值,比如程序在for循环中的运行。
但是,查看 java 文档和 Whosebug 中的答案,我仍然不确定如何解决我的问题,或者什么是解决我的问题的最佳方法。
由于我对JavaFX完全一无所知,谁能给我一些提示?
下面是项目
给出的Application.java
public class MyApplication extends Application {
private static final String UI_FILE = "/ui.fxml";
@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource(UI_FILE));
VBox root = (VBox) loader.load();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.setTitle("Team T-03: Course Scraper");
stage.show();
}
public static void main(String args[]) {
Application.launch(args);
}
}
我应该实现相关循环和方法的Controller.java
public class Controller {
@FXML
private ProgressBar progressbar;
@FXML
void doSomething() {
for (String object : objectList) {
List<someObject> v = someOtherFunc(object);
totalObjectCount += v.size();
progress = (double) ++objectCount / v.size();
progressbar.setProgress(progress);
}
}
}
使用 Task
,
并且 运行 它在一个新的 Thread
中。 Task
有自己的进度 属性,还有一个 updateProgress
方法确保进度的更改在 FX 应用程序线程上执行。然后,您可以将进度条的进度绑定到任务的进度:
@FXML
void doSomething() {
Task<Void> task = new Task<>() {
@Override
public Void call() {
for (String object : objectList) {
List<someObject> v = someOtherFunc(object);
totalObjectCount += v.size();
updateProgress(++objectCount, objectList.size());
}
return null ;
}
}
progressBar.progressProperty().bind(task.progressProperty());
new Thread(task).start();
}
我正在开发一个使用 JavaFX 的 ProgressBar 的 Java 项目。从我在Whosebug上发现的,通常需要添加一个线程,或者程序需要实现Runnable,以便动态更新ProgressBar的值,比如程序在for循环中的运行。
但是,查看 java 文档和 Whosebug 中的答案,我仍然不确定如何解决我的问题,或者什么是解决我的问题的最佳方法。
由于我对JavaFX完全一无所知,谁能给我一些提示?
下面是项目
给出的Application.javapublic class MyApplication extends Application {
private static final String UI_FILE = "/ui.fxml";
@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource(UI_FILE));
VBox root = (VBox) loader.load();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.setTitle("Team T-03: Course Scraper");
stage.show();
}
public static void main(String args[]) {
Application.launch(args);
}
}
我应该实现相关循环和方法的Controller.java
public class Controller {
@FXML
private ProgressBar progressbar;
@FXML
void doSomething() {
for (String object : objectList) {
List<someObject> v = someOtherFunc(object);
totalObjectCount += v.size();
progress = (double) ++objectCount / v.size();
progressbar.setProgress(progress);
}
}
}
使用 Task
,
并且 运行 它在一个新的 Thread
中。 Task
有自己的进度 属性,还有一个 updateProgress
方法确保进度的更改在 FX 应用程序线程上执行。然后,您可以将进度条的进度绑定到任务的进度:
@FXML
void doSomething() {
Task<Void> task = new Task<>() {
@Override
public Void call() {
for (String object : objectList) {
List<someObject> v = someOtherFunc(object);
totalObjectCount += v.size();
updateProgress(++objectCount, objectList.size());
}
return null ;
}
}
progressBar.progressProperty().bind(task.progressProperty());
new Thread(task).start();
}