如何进行循环延迟? (JavaFX)[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

button.setOnAction(new EventHandler<ActionEvent>() {
 @Override
 public void handle(ActionEvent event) {
    while(true) {
    s += 10;
    if((s>height/1.2) || (s == height/1.2)) {
        s = 0;
    }
    label.setLayoutX(s);
    }}});

如何在不停止主GUI线程的情况下停止循环?(Thread.sleep(1000)无效)

java javafx thread-sleep
1个回答
1
投票

你可以使用JavaFX Timeline。改变了here的代码。

下面的应用程序演示使用Timeline的一种方式。

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.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;
/**
 *
 * @author Sedrick
 */
public class JavaFXApplication25 extends Application {

    Integer s = 0;

    @Override
    public void start(Stage primaryStage) {

        Label label = new Label(s.toString());

        //This Timeline is set to run every second. It will increase s by 10 and set s value to the label.
        Timeline oneSecondsWonder = new Timeline(new KeyFrame(Duration.seconds(1), (ActionEvent event1) -> {
            s += 10;
            label.setText(s.toString());
        }));
        oneSecondsWonder.setCycleCount(Timeline.INDEFINITE);//Set to run Timeline forever or as long as the app is running.

        //Button used to pause and play the Timeline
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction((ActionEvent event) -> {
            switch(oneSecondsWonder.getStatus())
            {
                case RUNNING:
                    oneSecondsWonder.pause();
                    break;
                case PAUSED:
                    oneSecondsWonder.play();
                    break;
                case STOPPED:
                    oneSecondsWonder.play();
                    break;
            }                
        });

        VBox root = new VBox(btn, label);

        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);
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.