JavaFX Dynamic Code - PullRequest
       6

JavaFX Dynamic Code

0 голосов
/ 30 апреля 2018

Я хочу, чтобы сразу после увеличения значения я появлялся в метке Пример:

-в i = 0 показать 0

-в i = 1 показать 01

-в i = 2 показать 012

Можете ли вы помочь мне

import javafx.application.Application;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Example extends Application{
    @Override
    public void start (Stage primaryStage) {
        Pane pane=new Pane();
        Label label=new Label();
        Button bt=new Button("Start");

        pane.getChildren().addAll(bt,label);

        bt.setOnAction(e->{
            for (int i=0;i<10000000;i++) label.setText(label.getText()+i);
        });

        Scene scene = new Scene(pane,1000,500);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Вы можете использовать Timeline для выполнения этой задачи.

import java.util.concurrent.atomic.AtomicLong;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.Priority;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication177 extends Application
{

    @Override
    public void start(Stage primaryStage)
    {
        AtomicLong i = new AtomicLong();

        Label label = new Label();
        Button btn = new Button();

        Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(.5), (ActionEvent event) -> {//This controls how fast this should run. This example happens every half of a second
            label.setText(label.getText() + Long.toString(i.getAndIncrement()));
        }));
        timeline.setCycleCount(10000000);//This controls the amount of time this should run
        timeline.setOnFinished(event -> {//This tells what to do once cycle count is reached
            btn.setDisable(false);
        });

        btn.setText("Start");
        btn.setOnAction((ActionEvent event) -> {
            btn.setDisable(true);
            timeline.play();
        });

        StackPane stackPane = new StackPane(label);
        VBox root = new VBox(stackPane, new StackPane(btn));
        VBox.setVgrow(stackPane, Priority.ALWAYS);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

}
0 голосов
/ 01 мая 2018
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Test5 extends Application {
    private String text = "";
    private int i;
    @Override // Override the start method in the Application class
    public void start(Stage primaryStage) {
        StackPane pane = new StackPane();
        Label lblText = new Label("");
        pane.getChildren().add(lblText);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    for (i=0;i<10000;i++) {
                        Platform.runLater(new Runnable() { // Run from JavaFX GUI
                            @Override
                            public void run() {
                                lblText.setText(lblText.getText()+i);
                            }
                        });
                        Thread.sleep(200);
                    }
                }
                catch (InterruptedException ex) {

                }
            }
        }).start();
        Scene scene = new Scene(pane, 200, 50);
        primaryStage.setTitle("FlashText"); // Set the stage title
        primaryStage.setScene(scene); // Place the scene in the stage
        primaryStage.show(); // Display the stage
    }
}
0 голосов
/ 30 апреля 2018

Проблема в том, что вы обновляете значение метки, когда находитесь в потоке пользовательского интерфейса. JavaFX работает с моделью, в которой обновления выполняются на каждом тике (60 кадров в секунду). Все выполненные обновления видны только после завершения кода вашего Eventhander.

Кроме того, учитывая, что это длительное задание, это приведет к не отвечающему пользовательскому интерфейсу.

Вы должны использовать Worker, чтобы выполнить долгосрочную задачу. См. Учебник по асинхронной обработке. Обратите внимание, что это не гарантирует, что вы увидите все значения, поскольку рабочий может быть быстрее обновлений пользовательского интерфейса, и система объединит эти обновления.

...