gpt4 book ai didi

javafx-2 - 绑定(bind) JavaFX TableView 中所有单元格的样式属性

转载 作者:行者123 更新时间:2023-12-02 03:43:29 26 4
gpt4 key购买 nike

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

样式取决于表行的源项是否存在于某个列表中。

这是我目前所拥有的:

1) 保存表格行数据的数据类以及两个 bool 属性(如果数据包含在列表 X 中则为真)和一个应绑定(bind)到正确样式属性的字符串属性。

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) 表选择更改时的更改监听器,当表选择更改时相应地更新每个 bool 属性

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);
}
}
}
});

现在我想做的是以某种方式将每个表格单元格的样式属性绑定(bind)到 WebPageData 的样式属性 - 以便更改监听器更新两个 bool 属性,因此 WebPageData 的样式属性被更新,因此表格单元格的样式发生变化。

我尝试在创建阶段使用自定义 TableCellFactory 绑定(bind)样式,但当然这种方法失败了,因为此时不存在 WebPageData 实例。由于 TableColumn 类不提供遍历所有单元格的机会(因此我可以在表格实际获取其数据后绑定(bind)样式),我目前看到的唯一选择是保留对每个创建的表格单元格的引用。我不认为这个解决方案是好的做法。

那么有没有其他选项可以绑定(bind)单元格样式?如果我不绑定(bind)它们,每次表格选择更改时我都必须手动设置样式 - 这让我再次遇到“我无法遍历单元格”的问题。

最佳答案

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);
}
}
}

我知道很久以前就有人问过这个问题,但也许它会对某人有所帮助。

我有一个类似的问题想要解决。我知道您使用的是 TableCell,这涉及 TreeTableRow,但我相信概念是相同的:您想要更改数据对象中的字段,并让该更改更新表中显示该对象的任何位置的样式。

所以我扩展了 TreeTableRow 并为该类提供了自己的属性字段以保留。每次更新该行时,我都会取消绑定(bind)该属性并将其重新绑定(bind)到我想收听的字段。 (我对监听器也这样做。)因为每次调用 updateItem() 时,它都可能获得我的数据对象的不同实例。

“chosenStyle”只是我的样式表中一个改变背景颜色的类。使用类而不是调用 setStyle() 可以更轻松地删除样式。

关于javafx-2 - 绑定(bind) JavaFX TableView 中所有单元格的样式属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18791148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com