gpt4 book ai didi

java - 排序 TableView 时 TableRow 样式类不粘在行上

转载 作者:行者123 更新时间:2023-11-30 02:09:44 26 4
gpt4 key购买 nike

我想根据行项中的 boolean 值向表行添加/删除样式类。

使用以下代码可以按预期添加和删除类。但是,当我单击列标题对表重新排序时,样式将坚持行 id 而不是行项目。这意味着如果在订购之前对第一行进行了样式设置,则在订购之后样式仍然位于第一行而不是新位置的行。

setRowFactory(table -> {
TableRow<PowerPlantPM> row = new TableRow<>() {
@Override
protected void updateItem(PowerPlantPM pp, boolean empty) {
super.updateItem(pp, empty);
if (!empty && pp != null) {
pp.savedProperty().addListener((observable, oldValue, newValue) -> {
if (newValue) {
getStyleClass().remove("unsaved");
} else {
getStyleClass().add("unsaved");
}
});
// the following binding works (including ordering), but is not what I want because of the ":selected" pseudo class
// styleProperty().bind(Bindings.when(pp.savedProperty()).then("").otherwise("-fx-background-color: #f2dede"));
}
}
};
return row;
});

我希望我想要实现的目标很清楚。重新排序时如何使样式坚持到行项目?

最佳答案

TableRow 被尽可能地重用,在您的 updateItem 中您需要查询相应的属性,而不是为其添加监听器。仅当属性更改时监听器才会触发,但 TableRow 可能会要求在不同位置或不同项目上重绘。

protected void updateItem(PowerPlantPM pp, boolean empty) {
super.updateItem(pp, empty);
if (!empty && pp != null) {
if (!pp.isSaved()) {
getStyleClass().add("unsaved");
} else {
getStyleClass().remove("unsaved");
}
.....
}
}

使用它应该监视的属性创建您的ObservableList

 ObservableListFX<PowerPlantPM> powerplants = 
Collections.observableArrayList(pp -> new Observable[] { pp.savedProperty() });

此列表将报告您在 Observable[] 中返回的属性项的更改。

关于java - 排序 TableView 时 TableRow 样式类不粘在行上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50434218/

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