JavaFX的TreeView控件:setGraphic()不同层次treeItem的(JavaFX

2019-10-21 05:39发布

我创建应该有不同层次的treestructure的不同的图形一个TreeView。 它是一个3级结构,其中,所述根被隐藏。

为展开的节点图形: 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();
        }
    });

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


文章来源: JavaFX TreeView: setGraphic() for different levels of treeItem