Javafx 2 绑定JavaFX TableView中所有单元格的样式属性

Javafx 2 绑定JavaFX TableView中所有单元格的样式属性,javafx-2,Javafx 2,我有一个JavaFXTableView,其中每一行都应该有一个条件样式 样式设置取决于表行的源项是否存在于特定列表中 这就是我到目前为止所做的: 1) 保存表行数据的数据类,以及两个布尔属性(如果数据包含在列表X中,则为true)和一个应绑定到正确样式属性的字符串属性 private class WebPageData { private WebPage page; private BooleanProperty isReferenced = new SimpleBoolean

我有一个JavaFXTableView,其中每一行都应该有一个条件样式

样式设置取决于表行的源项是否存在于特定列表中

这就是我到目前为止所做的:

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);
                }
            }
        }
    });
tblResultData.getSelectionModel().getSelectedIndices().addListener(新ListChangeListener()){
@凌驾
public void onChanged(ListChangeListener.Change
import 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);
        }
    }
}