JavaFx。更改TreeItem文体条件
问题描述:
有树视图,其中的每个元素实现可视界面:JavaFx。更改TreeItem文体条件
public interface Viewable {
enum ViewStyle {
NEW("-fx-background-color: b8faa7;"),
NEW_PARENT("-fx-background-color: b8ebbb;"),
LOCKED("-fx-background-color: adadad; "),
HAS_NO_DATA("-fx-background-color: eb8d8d;");
String style;
ViewStyle(String style){
this.style = style;
}
public String getStyle() {
return style;
}
}
ViewStyle getViewStyle();
void setViewStyle(ViewStyle style);
StringProperty styleProperty();
String getTreeItemTitle();
void setTreeItemTitle(String title);
StringProperty titleProperty();
}
每个元素都有自己的.styleProperty(),并从ViewStyle.getStyle获得价值()
此属性绑定为每个TreeCell.styleProperty():
treeView.setCellFactory(new Callback<TreeView<Viewable>, TreeCell<Viewable>>() {
@Override
public TreeCell<Viewable> call(TreeView<Viewable> param) {
return new TreeCell<Viewable>() {
@Override
protected void updateItem(Viewable item, boolean empty) {
textProperty().unbind();
styleProperty().unbind();
if (empty || item == null) {
setGraphic(null);
textProperty().set(null);
styleProperty().set(null);
return;
}
if (item != null) {
styleProperty().bind(item.styleProperty());
textProperty().bind(item.titleProperty());
}
super.updateItem(item, empty);
}
};
}
});
问题是树单元格在选择中显示为丑。那是所选单元格的颜色不会改变。只更改字母的颜色(按照默认主题),但它不是很方便。因此,可能需要附加.css文件。同时,我不明白如何根据当前ViewStyle更改单元格的样式(默认和选择时)。
答
你可以在CSS属性简单地更改为一个仅用于非选择单元(-fx-control-inner-background
):
enum ViewStyle {
NEW("-fx-control-inner-background: b8faa7;"),
NEW_PARENT("-fx-control-inner-background: b8ebbb;"),
LOCKED("-fx-control-inner-background: adadad; "),
HAS_NO_DATA("-fx-control-inner-background: eb8d8d;");
还要注意的是你做了你不应该在一个覆盖版本做updateItem
方法:不总是调用super.updateItem
。这可能导致/empty
伪分配不正确,并且TreeCell
的item
属性不包含来自最近的updateItem
调用的项目。你应该这样做,而不是:
@Override
protected void updateItem(Viewable item, boolean empty) {
textProperty().unbind();
styleProperty().unbind();
if (empty || item == null) {
setText(null);
setStyle(null);
} else {
styleProperty().bind(item.styleProperty());
textProperty().bind(item.titleProperty());
}
super.updateItem(item, empty);
}
谢谢!有用! –