JavaFX8 样式没有立即更新

JavaFX8 Style not immediately updating

我试图在设置布尔值时更改 table 行的颜色。

所以我有这个代码:

boolean searchmode = false;
....

columns.forEach(c -> c.setCellFactory(column -> {
        return new TableCell<ShowableInWarenkorb, String>() {
            @Override
            protected void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);
                setText(empty ? null : item);
                if (searchmode) {
                    getStyleClass().add("searchmode");
                } else{
                    getStyleClass().remove("searchmode");
                }
            }
        };
    }));

这个CSS:

.searchmode {
    -fx-background-color: rgba(153,153,153,0.3);
})

然后我在更新 table 内容之前最终在我的代码中切换了搜索模式。

但是颜色并没有立即改变,有时我必须点击一下才能改变,如何手动触发?

从您的代码来看,您似乎想将此应用于 table 中的所有单元格。你完全可以在没有细胞工厂的情况下做到这一点(尽管你可能需要一个用于其他目的)。

PseudoClass searchmodePseudoClass = PseudoClass.getPseudoClass("searchmode");

然后当您更改搜索模式的值时,执行

table.pseudoClassStateChanged(searchmode);

在你的css中,做

.table-view:searchmode .table-cell {
    -fx-background-color: rgba(153,153,153,0.3);
}

如果你想"automate"更新到伪类状态,使用布尔值属性并添加一个监听器:

private final BooleanProperty searchmode = new SimpleBooleanProperty(false);

public final boolean isSearchmode() { 
    return searchmodeProperty().get();
}
public final void setSearchmode(boolean searchmode) {
    searchmodeProperty().set(searchmode);
}
public BooleanProperty searchmodeProperty() {
    return searchmode ;
}

那么如果你添加监听器

searchmode.addListener((obs, wasSearchmode, isNowSearchmode) -> 
    table.pseudoClassStateChanged(searchmodePseudoClass, isNowSearchmode));

所有内容都会自动连接,因此只要您调用 setSearchmode(...),table 就会更改。