我有一个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();
}
}