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