2014-11-05 55 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); 
    } 
}