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

How to stop a loop without stopping the main GUI thread?(Thread.sleep(1000) not worked)

A J
  • 1,439
  • 4
  • 25
  • 42
Snowmaze
  • 1
  • 5

1 Answers1

1

You could use JavaFX Timeline. Altered code from here.

The app below demos one way to use 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);
    }

}
SedJ601
  • 12,173
  • 3
  • 41
  • 59