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伪分配不正确,并且TreeCellitem属性不包含来自最近的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); 
} 
+0

谢谢!有用! –