如何在java中为已创build的新组件创buildFXML文件,而不是将其添加到场景构build器中?

我是javaFX的新手。 我创build了一个定制的search框(扩展TextField)在Java中,检查图像:

在这里输入图像描述

我用testing课对它进行了testing,它正在工作。

我想知道现在是否可以创buildFXML文件,而不是将此组件添加到场景构build器中? 怎么做 ? 提前致谢。

如何从JAR导入组件到SceneBuilder中

你可以把你的组件放在一个Jar中,并将其导入到SceneBuilder中。 您不需要为组件创buildFXML文件,以将其添加到SceneBuilder库面板。

请参阅将定制组件添加到 JavaFX用户指南的库部分。

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

  1. 从“库”面板的菜单中select“ 导入JAR / FXML文件”命令,或直接从系统的本机文件pipe理器(资源pipe理器或Finder)拖动JAR或FXML文件,然后将其放入“库”面板

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

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

  4. 点击导入组件。 导入的项目被添加到“库”面板的“自定义”部分。 它们可以立即使用,即使重新启动“场景生成器”后,它们仍会保留在“库”中

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

示例导入的组件用法

以下是使用上述方法导入到SceneBuilder中的自定义search字段组件。

搜索样本

顶部search面板位于“场景构build器”devise窗格中,底部search面板是使用“场景构build器”预览function并search“快乐”的结果。

示例SceneBuilder生成的代码

SceneBuilder根据devise生成的fxml文件包含在这里。 请注意,这只是我用SceneBuilder创build的testing场景,用于testing已导入的组件 – 它不是组件导入过程本身的一部分。

<?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> 

示例(可导入)组件代码

导入的search框的代码是:

 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. 您的组件类打包在已导入到SceneBuilder中的JAR文件中,如上所述。

故障排除

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

jar文件分析