Пользовательский интерфейс не обновляется при удалении узлов - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь удалить все узлы из моей панели последовательно 1 на 1, чтобы видеть каждую удаляемую строку. Для этого я создал новый поток и использовал класс задачи и обернул метод delWalls () в Platform.runLater (). Затем я использовал Thread.sleep, думая, что это замедлит цикл, поэтому я могу видеть, как обновляется пользовательский интерфейс при удалении каждой строки. Однако что происходит, если весь пользовательский интерфейс зависает, а затем после завершения цикла все узлы исчезают? Есть ли способ обойти это ... спасибо

* все узлы - это линии между прочим

 //loop calls delWalls() 1458 times to delete all 1458 nodes sequentailly
    Task task = new Task<Void>() {
        @Override
        public Void call() {
            Platform.runLater(() -> {
                try {
                    for (int i = 0; i <= 1458 - 1; i++) {
                        Thread.sleep(2);


                        delWalls();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });

            return null;
        }
    };
    new Thread(task).start();


    }

// Метод delWalls удаляет один узел при каждом вызове.

  public void delWalls() throws InterruptedException {

    pane.getChildren().remove(0);
 }

1 Ответ

2 голосов
/ 05 июля 2019

Как сказал @MadProgrammer, вам нужно работать с Timeline, чтобы получить желаемый эффект.Ниже приведен пример демонстрации того, как это можно сделать.Нажмите «Добавить», чтобы последовательно добавить узлы, и после добавления всех 10 узлов нажмите «удалить», чтобы удалить их один за другим.

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;

public class RemoveNodes_Demo extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        FlowPane pane = new FlowPane();
        pane.setVgap(10);
        pane.setHgap(10);

        Button button1 = new Button("Add Nodes");
        button1.setOnAction(e->{
            Timeline timeline = new Timeline(new KeyFrame(Duration.millis(400), x -> {
                StackPane sp = new StackPane();
                sp.setMinSize(100,100);
                sp.setStyle("-fx-background-color:black,red;-fx-background-insets:0,2;");
                pane.getChildren().add(sp);
            }));
            timeline.setCycleCount(10);
            timeline.play();
        });

        Button button2 = new Button("Remove Nodes");
        button2.setOnAction(e->{
            if(!pane.getChildren().isEmpty()){
                int count = pane.getChildren().size();
                Timeline timeline = new Timeline(new KeyFrame(Duration.millis(400), x -> {
                   if(!pane.getChildren().isEmpty()){ 
                      pane.getChildren().remove(0);
                   }
                }));
                timeline.setCycleCount(count);
                timeline.play();
            }
        });
        VBox root = new VBox(button1, button2,pane);
        root.setSpacing(10);
        Scene sc = new Scene(root, 600, 600);
        stage.setScene(sc);
        stage.show();
    }

    public static void main(String... a) {
        Application.launch(a);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...