我是javaFX的新手。我在java中创建了一个自定义的搜索框(扩展TextField),检查图像:
我用测试课测试了它并且它正在工作。
我现在想知道是否可以创建FXML文件而不是将此组件添加到场景构建器中?怎么做 ?提前谢谢。
答案 0 :(得分:12)
如何将组件从JAR导入SceneBuilder
您可以将组件放入Jar中并将其导入SceneBuilder。您不需要为组件创建FXML文件,以将其添加到SceneBuilder库面板。
请参阅JavaFX用户指南的Adding Custom Components to the Library部分。
从JAR或FXML文件导入自定义GUI组件:
从“库”面板的菜单中选择导入JAR / FXML 文件命令,或者 直接从系统的本机文件中拖动JAR或FXML文件 经理(资源管理器或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分析功能来帮助进行故障排除(这可能有助于或者可能仅提供一些含糊不清的信息以使您更加困惑)。 / p>