JavaFX:如何在treeview中使用复选框和按钮?

JavaFX:如何在treeview中使用复选框和按钮?,java,javafx,Java,Javafx,我是javafx新手 我试图在根目录下的树表中的每一列中包含复选框、标签和按钮 有可能吗。请帮助我找到解决方案,并提供一些相同的参考代码 谢谢, Vevek.您需要做的是为树状视图设置单元工厂 对您的评论的快速回复: 只是为了弄清楚术语。树结构(在TreeView中实现)由节点组成。一个节点可以有多个子节点和一个父节点。没有父节点的节点是根节点。没有任何子节点的节点是叶。每个树只能有一个根节点 但是在TreeView中可以做的是隐藏根节点。如果将多个子节点添加到根节点,然后隐藏根节点,则看起来您

我是javafx新手

我试图在根目录下的树表中的每一列中包含复选框、标签和按钮

有可能吗。请帮助我找到解决方案,并提供一些相同的参考代码

谢谢,
Vevek.

您需要做的是为树状视图设置单元工厂

对您的评论的快速回复: 只是为了弄清楚术语。树结构(在
TreeView
中实现)由节点组成。一个节点可以有多个子节点和一个父节点。没有父节点的节点是根节点。没有任何子节点的节点是叶。每个树只能有一个根节点

但是在
TreeView
中可以做的是隐藏根节点。如果将多个子节点添加到根节点,然后隐藏根节点,则看起来您有多个根节点。
TreeView
中的任何节点(包括根节点)都是
TreeItem
,您始终可以通过向
TreeItem
添加一个子节点来将其添加到
TreeItem
,然后该子节点可以拥有自己的子节点,等等。因此,您可以添加任意多个不同级别的节点

这是一个例子

导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.CheckBox;
导入javafx.scene.control.Label;
导入javafx.scene.control.TreeCell;
导入javafx.scene.control.TreeItem;
导入javafx.scene.control.TreeView;
导入javafx.scene.layout.HBox;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
公共类MCVE扩展应用程序{
公众假期开始(阶段){
VBox视图=新的VBox();
view.setPrefSize(600400);
//创建根节点
最终树项根=新树项(“根节点”);
root.setExpanded(true);
//创建将作为根节点的第一个子节点的树项
//和子节点的父节点。
最终TreeItem parentNode1=新TreeItem(“父节点1”);
final TreeItem parentNode2=新TreeItem(“父节点2”);
final TreeItem parentNode3=新TreeItem(“父节点3”);
//创建将成为父级的子级的树项目
//节点。
final TreeItem childNode1=新TreeItem(“子节点1”);
final TreeItem childNode2=新TreeItem(“子节点2”);
final TreeItem childNode3=新TreeItem(“子节点3”);
//将树项目添加到根目录
root.getChildren().setAll(parentNode1、parentNode2、parentNode3);
//将子节点添加到根节点的所有子节点
对于(TreeItem父级:root.getChildren()){
parent.getChildren().addAll(childNode1、childNode2、childNode3);
}
//创建树表视图
最终树视图树视图=新树视图(根);
//我们将show root设置为false。这将隐藏根,并且只在树视图中显示它的子级。
treeView.setShowRoot(假);
setCellFactory(e->new CustomCell());
view.getChildren().add(treeView);
场景=新场景(视图);
舞台场景;
stage.show();
}
/**
*一个自定义单元格,用于在中显示复选框、标签和按钮
*特雷塞尔。
*/
类CustomCell扩展了TreeCell{
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
//如果牢房是空的,我们什么也不显示。
if(isEmpty()){
设置图形(空);
setText(空);
}否则{
//如果自定义单元格是叶子,则仅显示该单元格,这意味着它具有
//没有孩子。
if(this.getTreeItem().isLeaf()){
//一个自定义HBox,将包含您的复选框、标签和
//按钮。
HBox细胞盒=新的HBox(10);
复选框=新复选框();
标签=新标签(项目);
按钮按钮=新按钮(“按下!”);
//这里我们将标签的pref高度绑定到复选框的高度,这样标签和复选框的大小就相同了。
label.prefHeightProperty().bind(checkBox.heightProperty());
cellBox.getChildren().addAll(复选框、标签、按钮);
//我们将cellBox设置为单元格的图形。
设置图形(手机盒);
setText(空);
}否则{
//如果这是根,我们只显示文本。
设置图形(空);
setText(项目);
}
}
}
}
公共静态void main(字符串[]args){
发射();
}
}
有关如何提供自定义单元工厂的信息,请参见
单元
类的


如果有任何不清楚的地方,请告诉我

感谢您的回复。是否有可能为树表开发一个带有列名的可见边框?哦,您想要的是
TreeTableView
,而不是
TreeView
。我用第二个例子更新了我的答案。整个树表视图以及每个列标题周围已经有边框。你想添加你自己的边界吗?你得到答案了吗?如果是:请将其标记为已接受答案。否则,请随时提问!Treeview适合我。但是如何添加第二、第三和更多根节点及其相应的子节点。我需要一个树结构,比如rootnode1及其子节点(复选框、标签和按钮),rootnode2及其子节点(复选框、标签和按钮)。请帮帮我,你要做的就是把根藏起来。检查我修改后的答案,请阅读有关术语的文本。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class MCVE extends Application {

    public void start(Stage stage) {

        VBox view = new VBox();
        view.setPrefSize(600, 400);

        // Creating the root node
        final TreeItem<String> root = new TreeItem<>("Root node");
        root.setExpanded(true);

        // Creating the tree items that will be the first children of the root node
        // and the parent to the child nodes.
        final TreeItem<String> parentNode1 = new TreeItem<>("Parent node 1");
        final TreeItem<String> parentNode2 = new TreeItem<>("Parent node 2");
        final TreeItem<String> parentNode3 = new TreeItem<>("Parent node 3");

        // Creating the tree items that will be the children of the parent
        // nodes.
        final TreeItem<String> childNode1 = new TreeItem<>("Child Node 1");
        final TreeItem<String> childNode2 = new TreeItem<>("Child Node 2");
        final TreeItem<String> childNode3 = new TreeItem<>("Child Node 3");

        // Adding tree items to the root
        root.getChildren().setAll(parentNode1, parentNode2, parentNode3);

        // Add the child nodes to all children of the root
        for (TreeItem<String> parent : root.getChildren()) {
            parent.getChildren().addAll(childNode1, childNode2, childNode3);
        }

        // Creating a tree table view
        final TreeView<String> treeView = new TreeView<>(root);

        // We set show root to false. This will hide the root and only show it's children in the treeview.
        treeView.setShowRoot(false);

        treeView.setCellFactory(e -> new CustomCell());

        view.getChildren().add(treeView);

        Scene scene = new Scene(view);
        stage.setScene(scene);
        stage.show();
    }

    /**
     * A custom cell that shows a checkbox, label and button in the
     * TreeCell.
     */
    class CustomCell extends TreeCell<String> {
        @Override
        protected void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);

            // If the cell is empty we don't show anything.
            if (isEmpty()) {
                setGraphic(null);
                setText(null);
            } else {
                // We only show the custom cell if it is a leaf, meaning it has
                // no children.
                if (this.getTreeItem().isLeaf()) {

                    // A custom HBox that will contain your check box, label and
                    // button.
                    HBox cellBox = new HBox(10);

                    CheckBox checkBox = new CheckBox();
                    Label label = new Label(item);
                    Button button = new Button("Press!");
                    // Here we bind the pref height of the label to the height of the checkbox. This way the label and the checkbox will have the same size. 
                    label.prefHeightProperty().bind(checkBox.heightProperty());

                    cellBox.getChildren().addAll(checkBox, label, button);

                    // We set the cellBox as the graphic of the cell.
                    setGraphic(cellBox);
                    setText(null);
                } else {
                    // If this is the root we just display the text.
                    setGraphic(null);
                    setText(item);
                }
            }
        }
    }

    public static void main(String[] args) {
        launch();
    }
}