Javafx 简明教程

JavaFX - TreeView

TreeView 是一个图形用户界面组件,用于显示一个分层的条目结构。它包含一个根节点和任意数量的子节点。树形视图主要用于组织层次结构中的数据。它提供了对数据与其关联的其他组件关系的更好理解。在下面的图中,我们可以看到一个组件树形视图。

sample treeview

TreeView in JavaFX

在 JavaFX 中,树形视图由一个名为 TreeView 的类表示。该类属于包 javafx.scene.control 。通过实例化这个类,我们可以在 JavaFX 中创建一个树形视图。TreeView 类的构造函数列在下面 −

  1. TreeView() − 它是构造一个空树形视图的默认构造函数。

  2. TreeView(TreeItem rootNode) − 它使用指定的根节点创建一个新树形视图。

How to create a TreeView in JavaFX?

按照下面的步骤在 JavaFX 中创建一个树形视图。

Step 1: Create the root node of TreeView

首先,为所有条目的列表创建容器。在这种情况下,根节点是容器,因为它保存所有子节点。要创建根节点,我们使用 TreeItem 类,它是 javafx.scene.control 的一部分包。将根节点的名称作为参数值传递给该类的构造函数。 −

// Creating the root node
TreeItem<String> root = new TreeItem<>("Smartphones");

Step 2: Create the child nodes of TreeView

再次使用 TreeItem 类创建子节点。创建子节点后,使用 getChildren() 方法以及 addAll() 添加必需的条目。

TreeItem<String> ios = new TreeItem<>("iOS");
ios.getChildren().addAll(
   new TreeItem<>("iPhone 15 Plus"),
   new TreeItem<>("iPhone 14")
);

Step 3: Add the child nodes to root nodes

要将子节点添加到根节点,请将子节点的名称作为参数值传递给 addAll() 方法,如下面的代码块所示 −

// Add the child nodes to the root node
root.getChildren().addAll(android, ios);

Step 4: Instantiate the TreeView class

要创建树形视图,请实例化 TreeView 类,并将根节点作为参数值传递给它的构造函数,如下面的代码所示 −

// Create the TreeView and add the root node
TreeView<String> treesV = new TreeView<>(root);

Step 5: Launching Application

创建树形视图后,请按照下面给出的步骤正确启动应用程序 −

  1. 首先,通过将 TreeView 对象作为参数值传递给它的构造函数来实例化名为 Scene 的类。我们还可以将应用程序屏幕的维度作为可选参数传递给该构造函数。

  2. 然后,使用 Stage 类的 setTitle() 方法设置阶段标题。

  3. 现在,使用名为 Stage 的类的 setScene() 方法将 Scene 对象添加到阶段。

  4. 使用名为 show() 的方法显示场景的内容。

  5. 最后,借助 launch() 方法启动应用程序。

Example

以下程序将使用 JavaFX 创建一个 TreeView。将此代码保存在名为 JavafxTreeview.java 的文件中。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.stage.Stage;
public class JavafxTreeview extends Application {
   @Override
   public void start(Stage stage) throws Exception {
      // Creating the root node
      TreeItem<String> root = new TreeItem<>("Smartphones");
      root.setExpanded(true);
      // Creating its child nodes
      TreeItem<String> android = new TreeItem<>("Android");
      android.getChildren().addAll(
         new TreeItem<>("Samsung Galaxy S23 Ultra"),
         new TreeItem<>("Xiaomi Redmi Note 13 Pro"),
         new TreeItem<>("OnePlus 11R")
      );
      TreeItem<String> ios = new TreeItem<>("iOS");
      ios.getChildren().addAll(
         new TreeItem<>("iPhone 15 Plus"),
         new TreeItem<>("iPhone 14")
      );
      // Add the child nodes to the root node
      root.getChildren().addAll(android, ios);
      // Create the TreeView and add the root node
      TreeView<String> treesV = new TreeView<>(root);
      // Create a scene and add the TreeView
      Scene scene = new Scene(treesV, 400, 300);
      stage.setTitle("TreeView in JavaFX");
      stage.setScene(scene);
      stage.show();
   }
   public static void main(String[] args) {
      launch(args);
   }
}

使用以下命令从命令提示符编译并执行已保存的 Java 文件 −

javac --module-path %PATH_TO_FX% --add-modules javafx.controls JavafxTreeview.java
java --module-path %PATH_TO_FX% --add-modules javafx.controls JavafxTreeview

在执行之后,上述程序会生成一个 JavaFX 窗口,其中显示了一个 TreeView,其中包含一个智能手机列表(如下所示)。

treeview output

Setting the mouse events for TreeView

如果我们想要展示哪些项目被用户点击,那么,我们可以通过传递一个 lambda 表达式来使用 setOnMouseClicked() 方法,如下所示的 JavaFX 代码中所示。将此代码保存在一个文件内,文件名是 JavafxTreeview.java

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.stage.Stage;
public class JavafxTreeview extends Application {
   @Override
   public void start(Stage stage) throws Exception {
      // Creating the root node
      TreeItem<String> root = new TreeItem<>("Smartphones");
      root.setExpanded(true);
      // Creating its child nodes
      TreeItem<String> android = new TreeItem<>("Android");
      android.getChildren().addAll(
         new TreeItem<>("Samsung Galaxy S23 Ultra"),
         new TreeItem<>("Xiaomi Redmi Note 13 Pro"),
         new TreeItem<>("OnePlus 11R")
      );
      TreeItem<String> ios = new TreeItem<>("iOS");
      ios.getChildren().addAll(
         new TreeItem<>("iPhone 15 Plus"),
         new TreeItem<>("iPhone 14")
      );
      // Add the child nodes to the root node
      root.getChildren().addAll(android, ios);
      // Create the TreeView and add the root node
      TreeView<String> treesV = new TreeView<>(root);
      // Handle mouse clicks on the nodes
      treesV.setOnMouseClicked(event -> {
         // Get the selected item
         TreeItem<String> item = treesV.getSelectionModel().getSelectedItem();
         if (item != null) {
            // Display the item text
            System.out.println(item.getValue());
         }
      });
      // Create a scene and add the TreeView
      Scene scene = new Scene(treesV, 400, 300);
      stage.setTitle("TreeView in JavaFX");
      stage.setScene(scene);
      stage.show();
   }
   public static void main(String[] args) {
      launch(args);
   }
}

要从命令提示符编译并执行已保存的 Java 文件,请使用以下命令−

javac --module-path %PATH_TO_FX% --add-modules javafx.controls JavafxTreeview.java
java --module-path %PATH_TO_FX% --add-modules javafx.controls JavafxTreeview

Output

在执行上述代码后,它将会生成以下输出。在点击这些项目时,其名称将会显示在控制台中。

treeview output2