TreeView是树形结构的控件,在移动平台使用率不算高,但是在PC平台是一个很常用的控件了。
TreeView是使用节点TreeItem来构建视图的,一个TreeItem既可以是根节点,也可以分支节点或者叶子节点,同时TreeItem可以设定前置的图像。
下面我们来看看TreeView怎么使用:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception{
        StackPane root = new StackPane();
        
        ImageView folderIcon = new ImageView();
        Image folderImage = new Image(getClass().getResourceAsStream("folder.png"));
        folderIcon.setImage(folderImage);
        folderIcon.setFitWidth(16);
        folderIcon.setFitHeight(16);
        TreeItem treeItem = new TreeItem<>("根目录");
        treeItem.setGraphic(folderIcon);
        treeItem.setExpanded(true);
        for(int i = 0;i < 5;i++){
            TreeItem item = new TreeItem<>("节点:" + i);
            treeItem.getChildren().add(item);
        }
        TreeView treeView = new TreeView<>(treeItem);
        root.getChildren().add(treeView);
        primaryStage.setTitle("TreeView的使用");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}在这里,我们通过treeItem.setGraphic(folderIcon)来设置TreeItem的图标,也可以通过treeItem.setExpanded来设定是否展开。
运行效果图如下:

另外,我们可以给TreeView添加一个菜单,用于添加Item,如下所示:
       ContextMenu menu = new ContextMenu();
        MenuItem addItem = new MenuItem("添加节点");
        addItem.setOnAction(e ->{
            treeItem.getChildren().add(new TreeItem<>("节点:" + treeItem.getChildren().size()));
        });
        menu.getItems().add(addItem);
        treeView.setContextMenu(menu);很简单,就是创建了ContextMenu,然后往Menu中增加Item菜单项,同时实现Item菜单项的事件。
通常来讲继承与javafx.scene.control.Control的,都可以通过setContextMenu来设置右键菜单。
运行效果如下:

添加节点之后:

同样的,我们也可以对选择的节点进行删除.
我们增加一个删除节点的菜单项,并实现删除方法:
      ContextMenu menu = new ContextMenu();
        MenuItem addItem = new MenuItem("添加节点");
        addItem.setOnAction(e ->{
            treeItem.getChildren().add(new TreeItem<>("节点:" + treeItem.getChildren().size()));
        });
        MenuItem deleteItem = new MenuItem("删除节点");
        deleteItem.setOnAction(e ->{
            TreeItem selectItem = treeView.getSelectionModel().getSelectedItem();
            treeItem.getChildren().remove(selectItem);
        });
        menu.getItems().add(addItem);
        menu.getItems().add(deleteItem);这里,我们通过TreeView的selectionModel来获取选中的Item项,然后从根节点中将其移除。
运行效果如下:

删除节点2后:

至于多层级的TreeView,只需要往TreeItem下面再添加子节点即可,使用方法是相同的。
那么TreeView的使用就讲解到这里了,下一节我们再见。
文章评论
设置图标后点击展开后图标就会消失,这是为什么呢
请问TreeView节点上能添加点击事件并跳转到相应的fxml界面么?
请问treetableview和treeview有什么区别呢?
@李冰冰 TreeTableView本质上是将TreeView和TableView结合起来的,新写了一篇文章你可以看看:从零开始学习javafx20-控件篇之treetableview(1)