我在填充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);
}
我的行长度可变。这可能是一个问题吗?
此表似乎也很慢。当我点击其中嵌入此选项卡的选项卡时,需要几秒钟才能显示。
由于
答案 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。