Как обновить sh javaFX группу после каждой фигуры, нарисованной в цикле? - PullRequest
0 голосов
/ 18 марта 2020

Допустим, мне нужно нарисовать несколько точек на экране. Один за другим с небольшой паузой после каждой точки. Как это сделать в JavaFX?

Моя программа-пример просто ждет до конца цикла, тогда все точки появляются одновременно.

public class PointByPoint extends Application {

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

@Override
public void start(Stage stage) throws Exception {
    GridPane root = new GridPane();
    Button startButton = new Button("start");
    Group group = new Group();
    root.add(startButton, 0, 0);
    root.add(group, 0, 1);
    Scene scene = new Scene(root, 1000, 1000);
    stage.setScene(scene);
    stage.show();

    startButton.setOnAction(actionEvent -> draw100points(group));
}

private void draw100points(Group group) {
    for (int i = 0; i < 100; i++){
        Circle circle = new Circle();
        circle.setRadius(1);
        circle.setCenterY(ThreadLocalRandom.current().nextInt(1, 1000 + 1));
        circle.setCenterX(ThreadLocalRandom.current().nextInt(1, 1000 + 1));
        circle.setFill(Color.BLACK);
        group.getChildren().add(circle);
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}}

1 Ответ

2 голосов
/ 18 марта 2020

Вы блокируете поток приложения FX с помощью sleep(...), поэтому он не может перерисовывать сцену каждый раз. Вместо этого используйте Timeline:

private void draw100points(Group group) {
    Timeline timeline = new Timeline();
    int interval = 10 ; // milliseconds
    for (int i = 0; i < 100; i++){
        Circle circle = new Circle();
        circle.setRadius(1);
        circle.setCenterY(ThreadLocalRandom.current().nextInt(1, 1000 + 1));
        circle.setCenterX(ThreadLocalRandom.current().nextInt(1, 1000 + 1));
        circle.setFill(Color.BLACK);
        KeyFrame keyFrame = new KeyFrame(Duration.millis(interval * i),
            e -> group.getChildren().add(circle));
        timeline.getKeyFrames().add(keyFrame);
    }
    timeline.play();
}

Разрыв в 10 миллисекунд может быть слишком мал, чтобы правильно это увидеть; Возможно, вы захотите немного замедлить анимацию, увеличив интервал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...