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)无效)
答案 0 :(得分: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);
}
}