如何根据不同类的进度更新JavaFX进度指示器?
我有一个由4门课程组成的课程: 1) GUI.java-包含JavaFX进度指示器GUI的程序 2) mainRun.java-运行task1.java和task2.java的“主”类。在实际的程序中,mainRun.java将负责整合来自task1.java和task2.java的多个信息,因此,需要此类 3) task1.java-将在task2.java之前运行的程序 4) task2.java-将在task1.java之后运行的程序 我想根据task1.java和task2.java中的updateProgress(X,Y)函数更新GUI.java的进度指示器 但是,mainRun.java将是调用task1.java的程序,之后是调用task2.java的程序。因此,GUI.java的进度指示器将仅基于从mainRun.java调用的updateProgress(X,Y)函数更新其进度 每当在task1.java和task2.java中运行updateProgress(X,Y)函数时(可能绕过mainRun.java?),我如何更新GUI.java的进度指示器? 否则,是否有一种方法可以主动通知mainRun.java来自task1.java和task2.java的updateProgress(X,Y),并在收到通知时更新GUI.java的进度指示器? 下面是我正在描述的问题的模拟伪示例: GUI.java如何根据不同类的进度更新JavaFX进度指示器?,java,javafx,Java,Javafx,我有一个由4门课程组成的课程: 1) GUI.java-包含JavaFX进度指示器GUI的程序 2) mainRun.java-运行task1.java和task2.java的“主”类。在实际的程序中,mainRun.java将负责整合来自task1.java和task2.java的多个信息,因此,需要此类 3) task1.java-将在task2.java之前运行的程序 4) task2.java-将在task1.java之后运行的程序 我想根据task1.java和task2.java中的
public class GUI extends Application {
private mainRun mainTask;
@Override
public void start(Stage primaryStage) {
final ProgressIndicator progressIndicator = new ProgressIndicator(0);
final Button startButton = new Button("Start");
// Start Button.
startButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
mainTask = new mainRun();
progressIndicator.progressProperty().unbind();
progressIndicator.setProgress(0);
progressIndicator.progressProperty().unbind();
progressIndicator.progressProperty().bind(mainTask.progressProperty());
new Thread(mainTask).start();
}
});
... JavaFX stage code ...
}
}
public class CopyTask extends Task<String> {
@Override
protected String call() throws Exception {
/** Update GUI.java's progress bar based on t1 here **/
task1 t1 = new task1();
ProgressIndicator progress = new ProgressIndicator(0);
progress.progressProperty().unbind();
progress.setProgress(0);
progress.progressProperty().bind(t1.progressProperty());
new Thread(t1).start();
t1.addEventHandler(WorkerStateEvent.WORKER_STATE_SUCCEEDED, //
new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent t) {
/** Continue updating GUI.java's progress bar based on t2 here **/
task2 t2 = new task2();
progress.progressProperty().unbind();
progress.progressProperty().bind(t2.progressProperty());
new Thread(t2).start();
}
});
return "Done";
}
}
public class task1 extends Task<String> {
protected String call() throws Exception {
for (int i =0; i<1000; i++) {
this.updateProgress(i,2000); // currently updates mainRun.java progress bar NOT GUI.java
}
return "";
}
}
public class task2 extends Task<String> {
protected String call() throws Exception {
for (int i =1000; i<2000; i++) {
this.updateProgress(i,2000); // currently updates mainRun.java progress bar NOT GUI.java
}
return "";
}
公共类GUI扩展应用程序{
私有主运行主任务;
@凌驾
公共无效开始(阶段primaryStage){
最终ProgressIndicator ProgressIndicator=新的ProgressIndicator(0);
最终按钮开始按钮=新按钮(“开始”);
//开始按钮。
startButton.setOnAction(新的EventHandler,它通过一个可靠的示例完美地解决了所有问题。您可以通过将progressbar的进度属性绑定到两个进度属性来实现:
import java.util.concurrent.TimeUnit;
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class TwoLongProcessWithOneProgressBar extends Application {
@Override
public void start(Stage stage) throws InterruptedException {
BorderPane mainPane = new BorderPane();
FlowPane topPane = new FlowPane(Orientation.HORIZONTAL, 5.,5.);
topPane.setPadding(new Insets(20.));
Panel panel = new Panel();
BorderPane.setAlignment(panel, Pos.CENTER);
Button button = new Button("Start");
button.setDefaultButton(true);
button.setOnAction(e -> {
panel.runLlongTask();
button.setDisable(true);
});
topPane.getChildren().add(button);
mainPane.setTop(topPane);
mainPane.setCenter(panel);
mainPane.setBottom(panel.getBar());
Scene scene = new Scene(mainPane, Color.WHITE);
stage.setScene(scene);
stage.centerOnScreen();
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
class Panel extends HBox{
private final ProgressBar bar;
Panel(){
setPrefSize(150,50);
bar = new ProgressBar();
bar.prefWidthProperty().bind(widthProperty());
}
void runLlongTask() {
Task task1 = new Task1();
Thread th1 = new Thread(task1);
th1.setDaemon(true);
Task task2 = new Task2();
Thread th2 = new Thread(task2);
th2.setDaemon(true);
//bind progress bar to both task progress property
bar.progressProperty().bind(task1.progressProperty().add(task2.progressProperty()));
th1.start();
th2.start();
}
ProgressBar getBar() { return bar; }
}
class Task1 extends Task<Void>{
@Override
protected Void call() throws Exception {
for (int i =0; i<1000; i++) {
TimeUnit.MILLISECONDS.sleep(100);
updateProgress(i,2000);
}
return null;
}
}
class Task2 extends Task<Void>{
@Override
protected Void call() throws Exception {
for (int i =0; i<1000; i++) {
TimeUnit.MILLISECONDS.sleep(100);
updateProgress(i,2000);
}
return null;
}
}
import java.util.concurrent.TimeUnit;
导入javafx.application.application;
导入javafx.concurrent.Task;
导入javafx.geometry.Insets;
导入javafx.geometry.Orientation;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.ProgressBar;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.FlowPane;
导入javafx.scene.layout.HBox;
导入javafx.scene.paint.Color;
导入javafx.stage.stage;
公共类TwoLongProcessWithOneProgressBar扩展了应用程序{
@凌驾
public void start(Stage)抛出InterruptedException{
BorderPane mainPane=新建BorderPane();
FlowPane topPane=新的FlowPane(方向水平,5,5.);
topPane.setPadding(新插图(20));
面板=新面板();
边框窗格。设置对齐(面板,位置中心);
按钮按钮=新按钮(“开始”);
按钮。设置默认按钮(true);
按钮。设置操作(e->{
panel.runLlongTask();
按钮。设置禁用(true);
});
topPane.getChildren().add(按钮);
主窗格。设置顶部(顶部);
主窗格。设置中心(面板);
setBottom(panel.getBar());
场景=新场景(主窗格,颜色为白色);
舞台场景;
stage.centerOnScreen();
stage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}
类面板扩展HBox{
私人终审法院;
小组(){
setPrefSize(150,50);
bar=新的ProgressBar();
bar.prefWidthProperty().bind(widthProperty());
}
void runLlongTask(){
任务task1=新任务1();
th1线程=新线程(task1);
th1.setDaemon(true);
任务task2=新任务2();
th2线程=新线程(task2);
th2.setDaemon(true);
//将进度条绑定到两个任务进度属性
bar.progressProperty().bind(task1.progressProperty().add(task2.progressProperty());
th1.start();
th2.start();
}
ProgressBar getBar(){return bar;}
}
类Task1扩展了任务{
@凌驾
受保护的Void调用()引发异常{
对于(int i=0;iHi c0der),感谢您的回复。将两个进度属性绑定在一起对于我的问题似乎不可行,因为程序(mainRun.java)编程运行task1和task2的不包含进度指示器。而是包含指示器的GUI.java-它不知道task1和task2。哦,等等!它成功了!我使用了:progress.progressProperty().bind(mainRun.t1.progressProperty().add(mainRun.t2.progressProperty());非常感谢!!!在我的示例中,进度条是gui的一部分,而不是任务。我很高兴它有所帮助。