首页 > 解决方案 > 如何进行循环延迟?(JavaFX)

问题描述

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) 不起作用)

标签: javajavafxthread-sleep

解决方案


你可以使用JavaFX Timeline. 从这里更改代码。

下面的应用程序演示了一种使用方式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);
    }

}

推荐阅读