gpt4 book ai didi

java - 删除节点时 UI 不更新

转载 作者:行者123 更新时间:2023-12-02 01:26:05 24 4
gpt4 key购买 nike

我正在尝试按顺序从 Pane 中删除所有节点,以便我可以看到每一行被删除。为此,我创建了一个新线程并使用任务类并将方法 delWalls() 包装在Platform.runLater() 。然后我使用 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);
}

最佳答案

正如@MadProgrammer所说,您需要使用时间轴才能获得所需的效果。下面是一个关于如何完成此操作的快速示例演示。点击“添加”依次添加节点,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);
}
}

关于java - 删除节点时 UI 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56894561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com