【发布时间】:2015-04-04 09:17:23
【问题描述】:
我是 javaFX 新手。我在 java 中创建了一个自定义的搜索框(扩展 TextField),查看图片:
我用一个测试类对其进行了测试,它正在工作。
我现在想知道是否可以创建它的 FXML 文件而不是将这个组件添加到场景构建器中?怎么做 ?提前致谢。
【问题讨论】:
标签: java javafx fxml scenebuilder
我是 javaFX 新手。我在 java 中创建了一个自定义的搜索框(扩展 TextField),查看图片:
我用一个测试类对其进行了测试,它正在工作。
我现在想知道是否可以创建它的 FXML 文件而不是将这个组件添加到场景构建器中?怎么做 ?提前致谢。
【问题讨论】:
标签: java javafx fxml scenebuilder
如何将组件从 JAR 导入 SceneBuilder
您可以将组件放入 Jar 中并将其导入到 SceneBuilder。您无需为组件创建 FXML 文件即可将其添加到 SceneBuilder 库面板。
请参阅 JavaFX 用户指南的 Adding Custom Components to the Library 部分。
从 JAR 或 FXML 文件导入自定义 GUI 组件:
从库面板的菜单中选择导入 JAR/FXML 文件命令,或者 直接从系统的本机文件中拖动 JAR 或 FXML 文件 管理器(Explorer 或 Finder)并将其放入库面板中
在“打开”对话框窗口中,导航到 JAR 或 FXML 的位置 您要导入的文件。导入对话框,类似于 显示在Figure 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>
示例(可导入)组件代码
导入的搜索框代码为:
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
);
}
}
组件先决条件
为了使流程正常运行,您需要确保以下几点:
疑难解答
如果您在导入 JAR 时遇到问题,在尝试导入 JAR 后,您可以使用下面记录的 JAR 分析功能来帮助排除故障(这可能会有所帮助,或者可能只是提供一些神秘信息,让您更加困惑)。
另外,从这个答案:
尝试从命令行启动 Scene Builder,您应该会看到库导入的输出,包括添加自定义控件时可能出现的异常。
【讨论】: