如何为java中已创建的新组件创建FXML文件,而不是将其添加到场景生成器中?

如何为java中已创建的新组件创建FXML文件,而不是将其添加到场景生成器中?,java,javafx,fxml,scenebuilder,Java,Javafx,Fxml,Scenebuilder,我是javaFX新手。我用java创建了一个自定义搜索框(扩展文本字段),请检查图像: 我用一个测试类对它进行了测试,它正在工作 我现在想知道是否可以创建其FXML文件,而不是将此组件添加到场景生成器?怎么做?提前感谢。如何将组件从JAR导入到SceneBuilder中 您可以将组件放入一个Jar中,并将其导入SceneBuilder。无需为组件创建FXML文件即可将其添加到SceneBuilder库面板 请参阅《JavaFX用户指南》的一节 从JAR或FXML文件导入自定义GUI组件: 从库

我是javaFX新手。我用java创建了一个自定义搜索框(扩展文本字段),请检查图像:

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


我现在想知道是否可以创建其FXML文件,而不是将此组件添加到场景生成器?怎么做?提前感谢。

如何将组件从JAR导入到SceneBuilder中

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

请参阅《JavaFX用户指南》的一节

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

  • 从库面板的菜单中选择导入JAR/FXML文件命令,或 直接从系统的本机文件中拖动JAR或FXML文件 管理器(资源管理器或查找器)并将其放入“库”面板

  • 在“打开”对话框窗口中,导航到JAR或FXML的位置 要导入的文件。导入对话框,类似于 如中所示,将显示。JAR文件的内容是 已检查并确定为 合适的自定义组件将显示在对话框窗口中。这个 对FXML文件的内容进行分析,以确保组件 添加的内容有效且自包含

  • 从“导入”对话框窗口中,从列表中选择或取消选择项目 可以导入的项目的数量

  • 单击导入组件。导入的项目将添加到自定义组件中 “库”面板的。它们可以立即使用,并且 即使在场景生成器重新启动后仍保留在库中

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

    导入组件使用示例

    下面是一个自定义搜索字段组件,我使用上述方法将其导入到SceneBuilder中

    顶部搜索面板位于“场景生成器设计”窗格中,底部搜索面板是使用“场景生成器预览”功能和搜索快乐的结果

    示例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>
    
    组件先决条件

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

  • 您的组件类扩展了节点
  • 组件类具有无参数构造函数
  • 您的组件类和无参数构造函数是公共的
  • 您的组件类位于包(例如org.jewelsea)中-它不能没有包集
  • 组件类打包在一个JAR文件中,该文件已如上所述导入到SceneBuilder中
  • 故障排除

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


    谢谢你的回答。我确实将eclipse项目导出到一个jar文件中。但是场景生成器没有检测到任何组件?java文件是否需要其他信息?还是遵循一种结构?天哪!谢谢你这么做!我喜欢!真的谢谢!我会重新加工我的部件:D谢谢
    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
            );
        }
    }