ben*_*ben 7 java javafx fxml scenebuilder
我是javaFX的新手.我在java中创建了一个自定义的搜索框(扩展TextField),检查图像:

我用测试类测试了它,它正在工作.
我现在想知道是否可以创建其FXML文件而不是将此组件添加到场景构建器中?怎么做 ?提前致谢.
jew*_*sea 12
如何将组件从JAR导入SceneBuilder
您可以将组件放在Jar中并将其导入SceneBuilder.您无需为组件创建FXML文件即可将其添加到SceneBuilder库面板.
请参阅JavaFX用户指南的" 向库中添加自定义组件"部分.
要从JAR或FXML文件导入自定义GUI组件:
从Library面板的菜单中选择Import JAR/FXML file命令,或直接从系统的本机文件管理器(Explorer或Finder)拖动JAR或FXML文件并将其放入Library面板
在"打开"对话框窗口中,导航到要导入的JAR或FXML文件的位置.将显示"导入"对话框,类似于图8-4中所示.检查JAR文件的内容,并在对话框窗口中显示被确定为合适的自定义组件的所有Java类.解析FXML文件的内容以确保添加的组件是有效且自包含的.
在"导入"对话框窗口中,从能够导入的项目列表中选择或取消选择项目.
单击导入组件.导入的项目将添加到"库"面板的"自定义"部分.它们可以立即使用,即使在重新启动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>
Run Code Online (Sandbox Code Playgroud)
样本(可导入)组件代码
导入的搜索框的代码是:
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
);
}
}
Run Code Online (Sandbox Code Playgroud)
组件先决条件
为了使流程有效,您需要确保以下几点:
故障排除
如果您在尝试导入JAR时遇到问题,则在尝试进行JAR导入后,可以使用下面记录的JAR分析功能来帮助进行故障排除(这可能有助于或可能仅提供一些含糊不清的信息以使您更加困惑).
