为了账号安全,请及时绑定邮箱和手机立即绑定

删除节点时 UI 不更新

删除节点时 UI 不更新

芜湖不芜 2023-03-09 10:47:46
我试图从我的窗格中逐个删除所有节点,这样我就可以看到每一行都被删除了。为此,我创建了一个新线程并使用了任务类并将方法 delWalls() 包装在平台中。运行后()。然后我使用 Thread.sleep 认为它会减慢循环速度所以我可以看到 UI 在每一行被删除时更新但是会发生什么情况是整个 UI 冻结然后在循环完成后所有节点都消失了?有没有办法解决这个......谢谢*所有节点都是线顺便说一句 //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 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

您需要使用 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);

    }

}


查看完整回答
反对 回复 2023-03-09
  • 1 回答
  • 0 关注
  • 83 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信