在Table View JavaFx中动态添加新元素

时间:2014-11-06 19:33:46

标签: java user-interface javafx javafx-8

这是我按下按钮theButton时用于在表格视图中添加元素的代码。

表格视图中填充了从网页上获取的元素,因此要填充整个表视图需要大约30秒......

我想动态添加所有数据,不希望所有放入表中的数据都准备就绪。所以现在碰巧按下按钮时,显示结果大约需要30秒左右。这是我的代码,它有什么问题吗?谢谢。

theButton.setOnAction(new EventHandler() 
{
        @Override
        public void handle(Event event) 
        {                       

            try
            {
                ObservableList<Elements> toShow = FXCollections.observableArrayList();

                ArrayList<String> strings = takeSomeStrings();

                for (int i = 0; i < strings.size(); i++) 
                {   
                    toShow.add(new Elements(takeInfoFromTheWeb(strings.get(i)))); 

                     myTableView.setItems(toShow);
                 }

                 } catch (FileNotFoundException e)
                 {
                     e.printStackTrace();
                 }
              }
         }
    }

1 个答案:

答案 0 :(得分:2)

使用 executor 在后台从Web获取数据。获取后,使用Platform.runLater()修改JavaFX应用程序线程上的TableView。

import java.util.concurrent.Executors;

private final Executor executor = Executors.newSingleThreadExecutor();

theButton.setOnAction(event ->
{
    try
    {
        ObservableList<Elements> toShow = FXCollections.observableArrayList();
        myTableView.setItems(toShow);

        ArrayList<String> strings = takeSomeStrings();

        for (String s: strings)
        {
            executor.execute(() -> {
                Elements el = new Elements(takeInfoFromTheWeb(s));
                Platform.runLater(() -> toShow.add(el));
            });
        }

    } catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
});

如果要并行获取数据,只需替换执行程序,例如

private final Executor executor = Executors.newFixedThreadPool(4);

您将同时下载最多4个项目。