2014-09-04 62 views

回答

3
// Your style classes: obviously choose names that logically reflect your application 
List<String> allTreeItemStyles = Arrays.asList("style1", "style2", "style3"); 

TreeView<MyTreeType> tree = new TreeView<>(); 
tree.setCellFactory(tv -> new TreeCell<MyTreeType>() { 
    @Override 
    public void updateItem(MyTreeType item, boolean empty) { 
     super.updateItem(item, empty); 
     getStyleClass().removeAll(allTreeItemStyles); 
     if (empty) { 
      setText(""); 
     } else { 
      setText(...); // appropriate text for item 
      String styleClass = ... ; // choose style class for item 
      getStyleClass().add(styleClass); 
     } 
    } 
}); 

如果由於某種原因,你正在使用JavaFX 2.2還停留,你需要用一個匿名內部類來代替lambda表達式:

tree.setCellFactory(new Callback<TreeView<MyTreeType>, TreeCell<MyTreeType>>() { 
    @Override 
    public TreeCell<MyTreeType> call(TreeView<MyTreeType> tv) { 
     return new TreeCell<MyTreeType>() { 
      @Override 
      public void updateItem(MyTreeType item, boolean empty) { 
       // implementation as above... 
      } 
     } 
    } 
}); 

然後在外部樣式表,只是做

.tree-cell.style1 { 
    /* ... */ 
} 

.tree-cell.style2 { 
    /* ... */ 
} 

/* etc */ 

(注有.tree-cell.style1之間沒有空格。)

+0

你怎麼在java 7中做到這一點? – user3111525 2014-09-09 09:28:16

+0

已更新爲顯示。只要把lambda變成一個匿名的內部類。 – 2014-09-09 14:41:09

+0

在JavaFX 2中,它們還不存在,但在JavaFX 8中,如果樣式反映項目的不同狀態(而不是其他類型),則也可以使用PseudoClasses。 – glglgl 2017-06-12 15:26:27

1

我知道OP使用Java 7和JavaFX 2.2,但對於誰使用JavaFX的8人,另一種優雅的方式是這樣的:

PseudoClass PSEUDOCLASS1 = PseudoClass.getPseudoClass("pseudoclass1"); 
PseudoClass PSEUDOCLASS2 = PseudoClass.getPseudoClass("pseudoclass2"); 
PseudoClass PSEUDOCLASS3 = PseudoClass.getPseudoClass("pseudoclass3"); 

TreeView<MyTreeType> tree = new TreeView<>(); 
tree.setCellFactory(treeView -> new TreeCell<MyTreeType>() { 
    @Override 
    public void updateItem(MyTreeType item, boolean empty) { 
     super.updateItem(item, empty); 
     if (empty) { 
      setText(""); 
      pseudoClassStateChanged(PSEUDOCLASS_1, false); 
      pseudoClassStateChanged(PSEUDOCLASS_2, false); 
      pseudoClassStateChanged(PSEUDOCLASS_3, false); 
     } else { 
      setText(item.getText()); 
      pseudoClassStateChanged(PSEUDOCLASS_1, item.isFoo()); 
      pseudoClassStateChanged(PSEUDOCLASS_2, item.isBar()); 
      pseudoClassStateChanged(PSEUDOCLASS_3, item.isBazinga()); 
     } 
    } 
}); 

在外部樣式表,你做那麼

.tree-cell:pseudoclass1 { 
    /* the way you want the cell styled if pseudo class 1 is active */ 
} 

.tree-cell:pseudoclass2 { 
    /* the way you want the cell styled if pseudo class 2 is active */ 
} 

.tree-cell:pseudoclass3 { 
    /* the way you want the cell styled if pseudo class 3 is active */ 
} 

CSS僞類用來反映某個狀態,而CSS類用來反映某個靜態屬性。但最終,這是一個有趣的問題。

相關問題