如何使用FXML在JavaFX中创建CheckBoxTreeItem

时间:2016-05-03 15:02:20

标签: javafx-8 fxml

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

CheckBoxTreeItem

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

有人可以帮我解决这个问题,还是有其他方法可以在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 个答案:

答案 0 :(得分:2)

在某种程度上,做你所要求的事情并没有任何意义。 FXML的目的是为您的应用程序定义布局(即视图)。 CheckBoxTreeItemTreeItem一般不是布局的一部分;它们是应用程序中显示的数据的一部分(即模型的一部分)。

话虽如此,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);
    }
}

我强烈怀疑你可以在Scene Builder中使用这个FXML,因为Scene Builder是一个设计布局的工具,而不是一个操作应用程序数据内容的工具。