如何使用 FXML 在 JavaFX 中创建 CheckBoxTreeItem

Posted

技术标签:

【中文标题】如何使用 FXML 在 JavaFX 中创建 CheckBoxTreeItem【英文标题】:How to create a CheckBoxTreeItem in JavaFX using FXML 【发布时间】:2016-05-03 15:02:20 【问题描述】:

我正在设计一个 javafx 中的独立应用程序(带有 scenebuilder 8 的 FXML),现在我需要在 FXML 中创建一个 CheckBoxTreeItem(见下图)。

CheckBoxTreeItem

在搜索它时,我得到了一个链接“https://docs.oracle.com/javase/8/scene-builder-2/user-guide/library-panel.htm”,它可以帮助我将自定义 CheckBoxTreeItem java 文件导入场景构建器,但在场景构建器中导入 JAR 分析报告后会抛出错误消息“不是节点”。

谁能帮我解决这个问题,或者有没有其他方法可以在 FXML 中创建 CheckBoxTreeItem。

在自定义 CheckBoxTreeItem 代码下方:

package Action;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.CheckBoxTreeCell;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class ComboboxTree extends Application 

    public static void main(String[] args) 
        launch(args);
    
    public void start(Stage primaryStage) 
        CheckBoxTreeItem<String> rootItem =
            new CheckBoxTreeItem<String>("Total list");
        rootItem.setExpanded(true);

        final TreeView tree = new TreeView(rootItem);
        tree.setEditable(true);

        tree.setCellFactory(CheckBoxTreeCell.<String>forTreeView());
        for (int i = 0; i < 8; i++) 
            final CheckBoxTreeItem<String> checkBoxTreeItem =
                new CheckBoxTreeItem<String>("List " + (i+1));
                    rootItem.getChildren().add(checkBoxTreeItem);
        

        tree.setRoot(rootItem);
        tree.setShowRoot(true);

        StackPane root = new StackPane();
        root.getChildren().add(tree);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    

【问题讨论】:

【参考方案1】:

在某种程度上,按照你的要求去做没有任何意义。 FXML 的目的是为您的应用程序定义布局(即视图)。 CheckBoxTreeItems 和 TreeItems 通常不属于布局的一部分;它们是应用程序中显示的数据的一部分(即模型的一部分)。

话虽如此,FXML 只是一种实例化对象并将它们链接在一起的方法,因此您没有理由不能使用 FXML 来执行此操作。这是您发布的 Java 的等价物:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.HBox?>
<?import javafx.scene.control.TreeView?>
<?import javafx.scene.control.CheckBoxTreeItem?>
<?import javafx.scene.control.cell.CheckBoxTreeCell?>

<HBox xmlns:fx="http://javafx.com/fxml/1">
    <TreeView editable="true">
        <root>
            <CheckBoxTreeItem value="Total list" expanded="true">
                <children>
                    <CheckBoxTreeItem value="List 1"/>
                    <CheckBoxTreeItem value="List 2"/>
                    <CheckBoxTreeItem value="List 3"/>
                    <CheckBoxTreeItem value="List 4"/>
                    <CheckBoxTreeItem value="List 5"/>
                    <CheckBoxTreeItem value="List 6"/>
                    <CheckBoxTreeItem value="List 7"/>
                    <CheckBoxTreeItem value="List 8"/>
                </children>
            </CheckBoxTreeItem>
        </root>
        <cellFactory>
            <CheckBoxTreeCell fx:factory="forTreeView"/>
        </cellFactory>
    </TreeView>
</HBox>

你可以用它来测试

import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application 

    @Override
    public void start(Stage primaryStage) throws IOException 
        primaryStage.setScene(new Scene(FXMLLoader.load(getClass().getResource("TreeWithCheckBoxItems.fxml")), 600, 600));
        primaryStage.show();
    

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

我强烈怀疑您是否可以将此 FXML 与 Scene Builder 一起使用,因为 Scene Builder 是用于设计布局的工具,而不是用于操作应用程序数据内容的工具。

【讨论】:

谢谢詹姆斯,是的,你是对的,Scene Builder 是一个设计布局的工具,我创建了一个单独的 java 文件 (controller.java) 来操作数据内容。

以上是关于如何使用 FXML 在 JavaFX 中创建 CheckBoxTreeItem的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX 动态添加按钮

JavaFX TableView分页 - 无法创建基于fxml的解决方案

Clone JavaFX Node?

在JavaFX中添加自定义组件

如何使用不同的 fxml 文件创建多个 javafx 控制器?

JavaFX:如何从 MenuItem 更改场景 (FXML)