将表视图行背景色绑定到布尔属性



我有一个布尔属性来指示对象是否有相应的文件:

public Track {
BooleanProperty fileIsMissing = new SimpleBooleanProperty ( false );
...
public BooleanProperty fileIsMissingProperty () {
return fileIsMissing;
}
public boolean isMissingFile() {
return fileIsMissing.getValue();
}
...
}

如果删除或添加文件,则此值将由另一个线程更新。

我有一个表格视图,可以按行显示曲目。

我希望在布尔属性更改时更改行背景的颜色 - 如果它是true,我希望背景是红色,如果是false我希望它是正常颜色。

我有以下内容,几乎有效:

trackTable.setRowFactory( tv -> {
TableRow <CurrentListTrack> row = new TableRow <>();
row.itemProperty().addListener( (obs, oldValue, newValue ) -> {
if ( newValue.isMissingFile() ) {
row.getStyleClass().add( "file-missing" );
} else {
row.getStyleClass().removeAll( Collections.singleton("file-missing") );
}
});
...
}

在 CSS 中:

.file-missing {
-fx-control-inner-background: palevioletred;
}

这会在首次将曲目添加到表中时正确设置背景,但它不会随着fileIsMissing的值发生变化而更新,这是有道理的,因为我根本没有绑定到该属性。

我怎样才能做到这一点?

可能你也需要侦听你的fileIsMissing 属性。

当前侦听器将对添加新的跟踪记录做出反应,嵌套侦听器将对跟踪更改做出反应。

可能是这样的:

row.itemProperty().addListener((obs, oldValue, newTrackValue) -> {
if (newTrackValue != null) {
newTrackValue.fileIsMissingProperty().addListener((o, old, newValue) -> {
if (newValue) {
row.getStyleClass().add("file-missing");
} else {
row.getStyleClass().remove("file-missing");
}
}
});

顺便说一句,要删除一个列表元素,您可以使用list.remove(Object(而不是通过列表删除所有元素。

最新更新