【问题标题】:JavaFX Table not populatingJavaFX 表未填充
【发布时间】:2013-12-28 17:13:11
【问题描述】:

我在填充 JavaFX 表视图时遇到问题。我有正确数量的行和列,但我的字符串没有显示在表格中。这是扩展的 TableView 类中的方法。

public void buildTable() {
    ArrayList<Phy> phy = manager.getPhy();
    ObservableList<ObservableList> list = FXCollections.observableArrayList();

    TableColumn v = new TableColumn("Virt");
    v.setMinWidth(100);

    TableColumn p = new TableColumn("Phy");
    p.setMinWidth(100);

    this.getColumns().addAll(v, p);

    int size = 0;
    for (Phy pp : phy) {
        ObservableList<String> row = FXCollections.observableArrayList();
        size = pp.getVirt().getFunc().size() > size ? pp.getVirt().getFunc().size() : size;

        row.add(pp.getVirt().getName());
        row.add(pp.getName());
        for (Func func : pp.getVirt().getFunc()) {
            row.add(func.getName());
        }
        list.add(row);
    }

    for (int i = 0; i < size; i++) {
        TableColumn obj = new TableColumn("Func " + i);
        obj.setMinWidth(100);
        this.getColumns().add(obj);
    }

    this.setItems(list);
}

我的行是可变长度的。这可能是个问题吗?

此表的显示速度似乎也很慢。当我点击嵌入了这个的选项卡时,需要几秒钟才能显示出来。

谢谢

【问题讨论】:

    标签: java user-interface javafx tableview


    【解决方案1】:

    永远!从 GUI 线程更新您的 GUI 组件!

    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            // code to update GUI elements
        }
    });
    

    Platform.runLater() 实质上是将您的语句添加到队列中,该队列以非阻塞方式执行以从 GUI 线程内部更新 GUI 元素。如果您尝试从非 GUI 线程更新 GUI 元素,有时它可能会工作,有时它不会,有时它会给出奇怪的线程异常,等等。

    另外,没有必要有 2 个ObservableList。只需使用一个,一次插入一行数据。

    您可能会发现此示例很有帮助:https://github.com/SnakeDoc/superD/blob/master/src/com/vanomaly/superd/controller/MainWindowController.java

    第 186 行启动将数据添加到表中的方法。如您所见,它使用Platform.runLater() 以及控制器类内部的静态方法(MVC 模式的一部分)。

    表和列设置在 64-68,列设置(用于特殊数据类型、格式等)在 133-163。

    【讨论】:

      猜你喜欢
      • 2014-10-08
      • 2018-10-14
      • 2013-06-06
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      相关资源
      最近更新 更多