我有一个布尔属性来指示对象是否有相应的文件:
public Track {
BooleanProperty fileIsMissing = new SimpleBooleanProperty ( false );
...
public BooleanProperty fileIsMissingProperty () {
return fileIsMissing;
}
public boolean isMissingFile() {
return fileIsMissing.getValue();
}
...
}
如果删除或添加文件,则由另一个线程更新此值。
我有一个TableView,可以在行中显示曲目。
我希望当BooleanProperty更改时,行的背景颜色会发生变化 - 如果它是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
的值的更改而更新,这是有道理的,因为我根本没有绑定到属性。
我怎样才能做到这一点?
答案 0 :(得分:2)
可能你也需要听你的fileIsMissing属性。
您的侦听器将对添加的新Track记录作出反应,嵌套侦听器将对Track更改做出反应。
可能是这样的:
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)而不是列表中的removeAll。