Javafx 2 绑定JavaFX TableView中所有单元格的样式属性
我有一个JavaFXTableView,其中每一行都应该有一个条件样式 样式设置取决于表行的源项是否存在于特定列表中 这就是我到目前为止所做的: 1) 保存表行数据的数据类,以及两个布尔属性(如果数据包含在列表X中,则为true)和一个应绑定到正确样式属性的字符串属性Javafx 2 绑定JavaFX TableView中所有单元格的样式属性,javafx-2,Javafx 2,我有一个JavaFXTableView,其中每一行都应该有一个条件样式 样式设置取决于表行的源项是否存在于特定列表中 这就是我到目前为止所做的: 1) 保存表行数据的数据类,以及两个布尔属性(如果数据包含在列表X中,则为true)和一个应绑定到正确样式属性的字符串属性 private class WebPageData { private WebPage page; private BooleanProperty isReferenced = new SimpleBoolean
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);
}
}
}
});
tblResultData.getSelectionModel().getSelectedIndices().addListener(新ListChangeListener()){
@凌驾
public void onChanged(ListChangeListener.Changeimport javafx.beans.property.ObjectProperty;
导入javafx.beans.property.SimpleObject属性;
导入javafx.beans.value.ChangeListener;
导入javafx.scene.control.TreeTableRow;
公共类HighlightBoundTreeTableRow扩展了TreeTableRow{
选择私有静态最终字符串\u STYLE\u CLASS=“chosenStyle”;
所选的私有最终ObjectProperty=新的SimpleObjectProperty();
私有最终ChangeListener属性ChangeListener=(obs、ov、nv)->updateHighlight();
@凌驾
受保护的void updateItem(对象项,布尔值为空){
super.updateItem(项,空);
//清理
getStyleClass().remove(选择的样式类);
selected.unbind();//解除绑定未绑定的内容没有效果
已选择。RemovelListener(propertyChangeListener);//也可以删除从未存在的侦听器
if(空){
返回;
}
selected.bind(item.chosenProperty());//bind还将设置初始值
已选择.addListener(propertyChangeListener);
updateHighlight();
}
私有void updateHighlight(){
if(已选择。get()){
getStyleClass().add(选择的样式类);
}否则{
getStyleClass().remove(选择的样式类);
}
}
}
我知道这个问题很久以前就被问过了,但也许它会帮助别人
我想解决一个类似的问题。我知道您使用的是TableCell,这涉及到一个TreeTableRow,但我相信概念是相同的:您希望更改数据对象中的字段,并让该更改在表中显示该对象的任何位置更新样式
因此,我扩展了TreeTableRow,并为该类提供了它自己的属性字段来保存。每次更新该行时,我都会解除该属性的绑定,并将其重新绑定到我要侦听的字段。(我对侦听器也会这样做。)因为每次调用updateItem()时,它都可能会得到我的数据对象的不同实例
“chosenStyle”只是我样式表中更改背景颜色的一个类。使用类而不是调用setStyle()可以更容易地删除样式
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.scene.control.TreeTableRow;
public class HighlightBoundTreeTableRow extends TreeTableRow<Thing> {
private static final String CHOSEN_STYLE_CLASS = "chosenStyle";
private final ObjectProperty<Boolean> chosen = new SimpleObjectProperty<>();
private final ChangeListener propertyChangeListener = (obs, ov, nv) -> updateHighlight();
@Override
protected void updateItem(Thing item, boolean empty) {
super.updateItem(item, empty);
//cleanup
getStyleClass().remove(CHOSEN_STYLE_CLASS);
chosen.unbind(); // unbinding something that is not bound has no effect
chosen.removeListener(propertyChangeListener); // also ok to remove a listener that was never there
if (empty) {
return;
}
chosen.bind(item.chosenProperty()); //bind will also set the intial value
chosen.addListener(propertyChangeListener);
updateHighlight();
}
private void updateHighlight() {
if (chosen.get()) {
getStyleClass().add(CHOSEN_STYLE_CLASS);
} else {
getStyleClass().remove(CHOSEN_STYLE_CLASS);
}
}
}