JavaFX表没有填充

时间:2013-12-10 22:58:10

标签: java user-interface javafx tableview

我在填充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);
}

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

此表似乎也很慢。当我点击其中嵌入此选项卡的选项卡时,需要几秒钟才能显示。

由于

1 个答案:

答案 0 :(得分: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。