2014-11-05 57 views
1

我創建了一個TreeView,應該有不同的圖形樹結構的不同層次。它是一個三層結構,其中根是隱藏的。JavaFX TreeView:setGraphic()爲不同層次的樹項目

的可擴展節點的圖形: http://i.imgur.com/wv00CEi.png

圖形葉節點:

只是在橫向盒標籤。

這是我到目前爲止已經試過,但我得到一個NullPointerException基本上說getTreeView爲空:

CustomTreeCellFactory

public final class CustomTreeCellFactory extends TreeCell<String>{ 
private TextField textField; 
private HBox hBox; 

public CustomTreeCellFactory(){ 
    super(); 
    if (getTreeView()==null){ 
     System.out.println("Her er problem"); 
    } 
    if (getTreeView().getTreeItemLevel(getTreeItem())==1){ 
     try { 
      hBox = (HBox) FXMLLoader.load(getClass().getResource("/Views/TreCell.fxml")); 
     } catch (IOException e) { 
      System.out.println("This didn't work"); 
      e.printStackTrace(); 
     } 
    } 
    else if (getTreeView().getTreeItemLevel(getTreeItem())==2){ 
     try { 
      hBox = (HBox) FXMLLoader.load(getClass().getResource("/Views/TreCellLowestLevel.fxml")); 
     } catch (IOException e) { 
      System.out.println("This didn't work"); 
      e.printStackTrace(); 
     } 
    } 


} 

代碼段從哪裏設置單元格工廠

TreeView<String> tree = (TreeView) parent.getChildren().get(0); 
    tree.setRoot(root); 
    tree.setShowRoot(false); 
    tree.setEditable(true); 
    tree.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() { 
     @Override 
     public TreeCell<String> call(TreeView<String> param) { 
      return new CustomTreeCellFactory(); 
     } 
    }); 

回答

1

我發現問題是什麼。

當我設置TreeView時,我試圖做的事情需要在更新方法中完成。

下面是解決該問題的代碼:

**Constructor** 
public CustomTreeCellFactory(){ 
    try { 
     hBox = (HBox) FXMLLoader.load(getClass().getResource("/Views/TreCell.fxml")); 
    } catch (IOException e) { 
     System.out.println("This didn't work"); 
     e.printStackTrace(); 
    } 
    try { 
     hBoxLeaf = (HBox) FXMLLoader.load(getClass().getResource("/Views/TreCellLowestLevel.fxml")); 
    } catch (IOException e) { 
     System.out.println("This didn't work"); 
     e.printStackTrace(); 
    } 

} 

更新方法

@Override 
public void updateItem(String item, boolean empty) { 
    super.updateItem(item, empty); 

    if (item != null) { 
     if (getTreeView().getTreeItemLevel(getTreeItem())==1) { 
      setGraphic(this.hBox); 
     }else if (getTreeView().getTreeItemLevel(getTreeItem())==2){ 
      setGraphic(this.hBoxLeaf); 
     } 
    } else { 
     setGraphic(null); 
    } 
}