Graphics JavaFX TreeView:setGraphic()用于不同级别的treeItem

Graphics JavaFX TreeView:setGraphic()用于不同级别的treeItem,graphics,javafx,treeview,Graphics,Javafx,Treeview,我正在创建一个树视图,对于不同层次的树结构应该有不同的图形。它是一个三层结构,根隐藏在其中 可扩展节点的图形: 叶节点的图形: 只是hBox中的一个标签 这是我到目前为止尝试过的,但我得到一个nullPointerException,基本上是说getTreeView为null: CustomTreeCellFactory public final class CustomTreeCellFactory extends TreeCell<String>{ private TextFi

我正在创建一个树视图,对于不同层次的树结构应该有不同的图形。它是一个三层结构,根隐藏在其中

可扩展节点的图形:

叶节点的图形:

只是hBox中的一个标签

这是我到目前为止尝试过的,但我得到一个nullPointerException,基本上是说getTreeView为null:

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();
        }
    });
公共最终类CustomTreeCellFactory扩展了TreeCell{
私有文本字段文本字段;
私人HBox;
公共CustomTreeCellFactory(){
超级();
如果(getTreeView()==null){
System.out.println(“她的er问题”);
}
如果(getTreeView().getTreeItemLevel(getTreeItem())==1){
试一试{
hBox=(hBox)fxmloader.load(getClass().getResource(“/Views/TreCell.fxml”);
}捕获(IOE异常){
System.out.println(“这不起作用”);
e、 printStackTrace();
}
}
else if(getTreeView().getTreeItemLevel(getTreeItem())==2){
试一试{
hBox=(hBox)fxmloader.load(getClass().getResource(“/Views/trecellllowestlevel.fxml”);
}捕获(IOE异常){
System.out.println(“这不起作用”);
e、 printStackTrace();
}
}
}
设置单元格工厂的代码片段

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();
        }
    });
TreeView tree=(TreeView)parent.getChildren().get(0);
树根;
tree.setShowRoot(false);
tree.setEditable(true);
setCellFactory(新回调(){
@凌驾
公共TreeCell调用(TreeView参数){
返回新的CustomTreeCellFactory();
}
});

我发现了问题所在

当树视图被设置时,我试图做的事情需要在更新方法中完成

以下是解决问题的代码:

**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);
    }
}