JavaFX:在线程中添加许多节点到FlowPane



我有一个FlowPane,其中添加了很多元素(~1000),这些元素中的每一个都包含一个ImageView和其他一些元素,并从fxml文件加载。有了这么多条目,需要很长时间才能呈现节点,然后一次显示所有节点。

因此,我想使用线程一个接一个地添加节点。我尝试了以下操作:

Platform.runLater(new Runnable() {
    @Override
    public void run() {
        for (Object v : collection.getObjects()) {
            addEntry(v);
            flowPane.requestLayout();
        }
    }
});

addEntry()所做的基本上只是从fxml中加载节点并将其添加到flowPane。

使用此代码,flowPane立即呈现,但节点仍然同时出现。

谁能给我指个正确的方向?谢谢!

您的运行程序正在同时做所有事情。这就像是用所有节点更新gui的一次调用。它需要在循环中被反复调用。

import javafx.application.Application;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class FlowPaneTest extends Application {
    @Override
    public void start(Stage primaryStage) {
        final FlowPane flow = new FlowPane();
        flow.getChildren().add(new Text("Starting "));
        Task task = new Task() {
            @Override protected Void call() throws Exception {
                //for (Object v : collection.getObjects()){
                for (int i = 0; i < 100; i++) {//use your loop instead
                    Platform.runLater(()->{
                        flow.getChildren().add(new Text("adding node "));
                    });
                    Thread.sleep(100);
                }
                return null;
            }
        };
        Scene scene = new Scene(flow, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
        Thread th = new Thread(task);
        th.setDaemon(true);
        th.start();
    }
}

最新更新