如何在java中为已创build的新组件创buildFXML文件,而不是将其添加到场景构build器中?
我是javaFX的新手。 我创build了一个定制的search框(扩展TextField)在Java中,检查图像:
我用testing课对它进行了testing,它正在工作。
我想知道现在是否可以创buildFXML文件,而不是将此组件添加到场景构build器中? 怎么做 ? 提前致谢。
如何从JAR导入组件到SceneBuilder中
你可以把你的组件放在一个Jar中,并将其导入到SceneBuilder中。 您不需要为组件创buildFXML文件,以将其添加到SceneBuilder库面板。
请参阅将定制组件添加到 JavaFX用户指南的库部分。
从JAR或FXML文件导入自定义的GUI组件:
从“库”面板的菜单中select“ 导入JAR / FXML文件”命令,或直接从系统的本机文件pipe理器(资源pipe理器或Finder)拖动JAR或FXML文件,然后将其放入“库”面板
在“打开”对话框中,导航到要导入的JAR或FXML文件的位置。 显示与图8-4所示相似的导入对话框。 检查JAR文件的内容,并确定所有被确定为合适的自定义组件的Java类都显示在对话窗口中。 FXML文件的内容被parsing,以确保被添加的组件是有效的和独立的。
从“导入”对话框中,select或取消select您可以导入的项目列表中的项目。
点击导入组件。 导入的项目被添加到“库”面板的“自定义”部分。 它们可以立即使用,即使重新启动“场景生成器”后,它们仍会保留在“库”中
请注意,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 ); } }
组件先决条件
为了使这个过程起作用,你需要确保一些事情:
- 你的组件类扩展了Node。
- 你的组件类有一个没有参数的构造函数。
- 你的组件类和没有参数的构造函数是公共的。
- 你的组件类是在一个包(例如org.jewelsea) – 它不能没有包的设置。
- 您的组件类打包在已导入到SceneBuilder中的JAR文件中,如上所述。
故障排除
如果您在导入JAR时遇到问题,则在尝试导入JAR之后,可以使用下面介绍的JAR分析function来帮助进行故障排除(这可能会有所帮助,或者可能只是提供一些让您更加困惑的信息)。