如何使用 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 的目的是为您的应用程序定义布局(即视图)。 CheckBoxTreeItem
s 和 TreeItem
s 通常不属于布局的一部分;它们是应用程序中显示的数据的一部分(即模型的一部分)。
话虽如此,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 TableView分页 - 无法创建基于fxml的解决方案