我有一个 JavaFX TableView,其中每一行都应该有一个条件样式。
样式取决于表行的源项是否存在于某个列表中。
这是我到目前为止所拥有的:
1) 将表格行的数据与两个布尔属性(如果数据包含在列表 X 中,则为 true)和一个应该绑定到正确样式属性的字符串属性一起保存的数据类。
private class WebPageData {
private WebPage page;
private BooleanProperty isReferenced = new SimpleBooleanProperty(false);
private BooleanProperty isReferencing = new SimpleBooleanProperty(false);
private StringBinding style = new When(isReferenced).then("...").otherwise(...);
}
2) 表选择更改的更改侦听器,当表选择更改时,相应地更新每个布尔属性
tblResultData.getSelectionModel().getSelectedIndices().addListener(new ListChangeListener<Integer>() {
@Override
public void onChanged(ListChangeListener.Change<? extends Integer> arg0) {
if (arg0.getList().size() == 0) {
selectedPage.set(null);
} else {
// for coloring only consider the first selected row
// multi select must be doable for certain other features
WebPage selectedWebPage = tblResultData.getItems().get(arg0.getList().get(0)).page;
selectedPage.set(selectedWebPage);
// tableModel.data holds a list of data for every table row
for (WebPageData data : tableModel.data) {
boolean referenced = selectedWebPage.getReferencedWebPagesList().contains(data.page);
boolean referencing = selectedWebPage.getReferencingWebPagesList().contains(data.page);
data.isReferenced.set(referenced);
data.isReferencing.set(referencing);
}
}
}
});
现在我想要做的是以某种方式将每个表格单元格的样式属性绑定到 WebPageData 的样式属性 - 以便更改侦听器更新两个布尔属性,因此 WebPageData 的样式属性被更新,因此样式表格单元格更改。
我尝试在创建阶段使用自定义 TableCellFactory 来绑定样式,但是这种方法当然会失败,因为此时没有 WebPageData 实例。由于 TableColumn 类不提供迭代所有单元格的机会(因此我可以在表格实际获取其数据后绑定样式),我目前看到的唯一选择是保留对每个创建的表格单元格的引用。我不认为这个解决方案是好的做法。
那么还有其他选项可以绑定单元格样式吗?如果我不绑定它们,我必须在每次表格选择更改时手动设置样式——这让我再次陷入“我无法遍历单元格”的问题。