有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

方法中的java更新JavaFX阶段

我正在写一个程序,它使用大量的数据来做一些计算,并且需要相当长的时间才能完成。这就是为什么我想更新并通知用户当前正在完成的程序的百分比。但是,我不知道如何在计算方法中更新阶段

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;
 
public class Main extends Application {
    
    public void calculate() {
        //Here I want to change the "percentage text"
        //and update the stage.
    }
    
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");
        
        Text percentage = new Text();
        
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
 
            @Override
            public void handle(ActionEvent event) {
                calculate();
            }
        });
        
        final GridPane inputGridPane = new GridPane();
        GridPane.setConstraints(btn, 0, 0);
        GridPane.setConstraints(percentage, 1, 0);
        inputGridPane.setHgap(6);
        inputGridPane.setVgap(6);
        inputGridPane.getChildren().addAll(btn, percentage);
        
        final Pane rootGroup = new VBox(12);
        rootGroup.setPrefWidth(400);
        rootGroup.setPrefHeight(225);
        rootGroup.getChildren().addAll(inputGridPane);
        rootGroup.setPadding(new Insets(12,12,12,12));
        
        primaryStage.setScene(new Scene(rootGroup));
        primaryStage.show();
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}

这就是我的代码大致的样子。先谢谢你


共 (1) 个答案

  1. # 1 楼答案

    JavaFx提供了一个名为“Task”的类,它可以用于后台计算,同时保持进程同步

    我建议这样做:

    创建用于执行繁重计算的第二个类扩展任务:

    import javafx.concurrent.Task;
    
    public class CalculationTask extends Task<String> {
        @Override
        protected String call() throws Exception {
            for (int i = 0; i < 100000000;i++) {
                updateProgress(i, 100000000);
            }
    
            succeeded();
            return "This is the computed result... Datatype can be changed by generics if you are calculation numbers";
        }
    }
    

    这是在应用程序类中使用它的一种方法:

    import javafx.application.Application;
    import javafx.concurrent.Task;
    import javafx.concurrent.WorkerStateEvent;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.geometry.Insets;
    import javafx.scene.Scene;
    import javafx.scene.control.Alert;
    import javafx.scene.control.Button;
    import javafx.scene.control.Dialog;
    import javafx.scene.control.ProgressBar;
    import javafx.scene.layout.GridPane;
    import javafx.scene.layout.Pane;
    import javafx.scene.layout.VBox;
    import javafx.scene.text.Text;
    import javafx.stage.Stage;
    
    public class Main extends Application {
        @Override
        public void start(Stage primaryStage) {
            primaryStage.setTitle("Hello World!");
    
    
    
            Button btn = new Button();
            btn.setText("Say 'Hello World'");
    
            Task<String> calculationTask = new CalculationTask();
    
            ProgressBar progressBar = new ProgressBar(); //ProgressIndicator could also be used
            progressBar.progressProperty().bind(calculationTask.progressProperty());
            progressBar.visibleProperty().bind(calculationTask.runningProperty());
    
            btn.setOnAction(new EventHandler<ActionEvent>() {
    
                @Override
                public void handle(ActionEvent event) {
                    calculationTask.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
                        @Override
                        public void handle(WorkerStateEvent workerStateEvent) {
                            new Alert(Alert.AlertType.CONFIRMATION, calculationTask.getValue()).show();
                        }
                    });
                    new Thread(calculationTask).start();
                }
            });
    
    
    
    
            final GridPane inputGridPane = new GridPane();
            GridPane.setConstraints(btn, 0, 0);
            GridPane.setConstraints(progressBar, 1, 0);
            inputGridPane.setHgap(6);
            inputGridPane.setVgap(6);
            inputGridPane.getChildren().addAll(btn, progressBar);
    
            final Pane rootGroup = new VBox(12);
            rootGroup.setPrefWidth(400);
            rootGroup.setPrefHeight(225);
            rootGroup.getChildren().addAll(inputGridPane);
            rootGroup.setPadding(new Insets(12,12,12,12));
    
            primaryStage.setScene(new Scene(rootGroup));
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    我希望这有帮助,否则请随意提问