【问题标题】:How to create an FXML file for an already created new component in java than add it to scene builder?如何在 java 中为已创建的新组件创建 FXML 文件而不是将其添加到场景构建器?
【发布时间】:2015-04-04 09:17:23
【问题描述】:

我是 javaFX 新手。我在 java 中创建了一个自定义的搜索框(扩展 TextField),查看图片:

我用一个测试类对其进行了测试,它正在工作。

我现在想知道是否可以创建它的 FXML 文件而不是将这个组件添加到场景构建器中?怎么做 ?提前致谢。

【问题讨论】:

    标签: java javafx fxml scenebuilder


    【解决方案1】:

    如何将组件从 JAR 导入 SceneBuilder

    您可以将组件放入 Jar 中并将其导入到 SceneBuilder。您无需为组件创建 FXML 文件即可将其添加到 SceneBuilder 库面板。

    请参阅 JavaFX 用户指南的 Adding Custom Components to the Library 部分。

    从 JAR 或 FXML 文件导入自定义 GUI 组件:

    1. 从库面板的菜单中选择导入 JAR/FXML 文件命令,或者 直接从系统的本机文件中拖动 JAR 或 FXML 文件 管理器(Explorer 或 Finder)并将其放入库面板中

    2. 在“打开”对话框窗口中,导航到 JAR 或 FXML 的位置 您要导入的文件。导入对话框,类似于 显示在Figure 8-4 中。 JAR 文件的内容是 检查和所有被确定为的 Java 类 合适的自定义组件显示在对话窗口中。这 解析 FXML 文件的内容以确保组件 添加是有效且独立的。

    3. 在“导入”对话框窗口中,从列表中选择或取消选择项目 您可以导入的项目。

    4. 单击导入组件。导入的项目被添加到自定义 库面板的部分。它们可以立即使用,而且 即使在 Scene Builder 重新启动后仍保留在库中

    注意,SceneBuilder 还支持导入基于 FXML 的组件,而不仅仅是直接的代码组件。此答案仅讨论导入不包含 FXML 的仅代码组件。

    导入组件使用示例

    这是我使用上述方法导入到 SceneBuilder 的自定义搜索字段组件。

    顶部搜索面板在Scene Builder设计窗格中,底部搜索面板是使用Scene Builder预览功能搜索幸福的结果。

    SceneBuilder 生成代码示例

    SceneBuilder根据设计生成的fxml文件包含在这里。请注意,这只是我使用 SceneBuilder 创建的一个测试场景,用于测试已导入的组件 - 它不是组件导入过程本身的一部分。

    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.scene.text.*?>
    <?import org.jewelsea.*?>
    <?import javafx.geometry.*?>
    <?import javafx.scene.control.*?>
    <?import java.lang.*?>
    <?import javafx.scene.layout.*?>
    
    
    <VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" spacing="10.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
       <children>
          <Label text="Search Field Import Test">
             <font>
                <Font size="16.0" />
             </font>
          </Label>
          <SearchField />
       </children>
       <padding>
          <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
       </padding>
    </VBox>
    

    示例(可导入)组件代码

    导入的搜索框代码为:

    package org.jewelsea;
    
    import javafx.geometry.Insets;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.StackPane;
    import javafx.scene.layout.VBox;
    
    public class SearchField extends StackPane {
        private final TextField textField;
        private final Button searchButton;
        private final Label searchResults;
    
        public SearchField() {
            textField = new TextField();
            textField.setPromptText(
                    "Search Text"
            );
    
            searchButton = new Button("Search");
    
            searchResults = new Label();
    
            VBox layout = new VBox(
                    20,
                    new HBox(
                            10,
                            textField,
                            searchButton
                    ),
                    searchResults
            );
            layout.setPadding(new Insets(10));
    
            searchButton.setOnAction(event ->
                    searchResults.setText(
                            "Search result for " + textField.getText()
                    )
            );
    
            getChildren().setAll(
                    layout
            );
        }
    }
    

    组件先决条件

    为了使流程正常运行,您需要确保以下几点:

    1. 您的组件类扩展了 Node。
    2. 您的组件类有一个无参数构造函数。
    3. 您的组件类和无参数构造函数是公开的。
    4. 您的组件类在一个包中(例如 org.jewelsea) - 它不能没有包集。
    5. 您的组件类被打包在一个 JAR 文件中,该文件已按上述方式导入到 SceneBuilder。

    疑难解答

    如果您在导入 JAR 时遇到问题,在尝试导入 JAR 后,您可以使用下面记录的 JAR 分析功能来帮助排除故障(这可能会有所帮助,或者可能只是提供一些神秘信息,让您更加困惑)。

    另外,从这个答案:

    尝试从命令行启动 Scene Builder,您应该会看到库导入的输出,包括添加自定义控件时可能出现的异常。

    【讨论】:

    • 感谢您的回答。我确实将 eclipse 项目导出到一个 jar 文件中。但是场景构建器没有检测到任何组件? java文件是否需要任何其他信息?还是遵循一个结构?
    • 天啊!感谢这一切!我喜欢它 !真的谢谢 !我会返工我的组件:D 谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-12-06
    • 2017-07-25
    • 1970-01-01
    • 2021-11-11
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多