将TableView行背景颜色绑定到Boolean属性

时间:2017-07-12 03:22:11

标签: javafx

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

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的值的更改而更新,这是有道理的,因为我根本没有绑定到属性。

我怎样才能做到这一点?

1 个答案:

答案 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。