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

ben*_*ben 7 java javafx fxml scenebuilder

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

在此输入图像描述

我用测试类测试了它,它正在工作.

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

jew*_*sea 12

如何将组件从JAR导入SceneBuilder

您可以将组件放在Jar中并将其导入SceneBuilder.您无需为组件创建FXML文件即可将其添加到SceneBuilder库面板.

请参阅JavaFX用户指南的" 向库中添加自定义组件"部分.

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

  1. 从Library面板的菜单中选择Import JAR/FXML file命令,或直接从系统的本机文件管理器(Explorer或Finder)拖动JAR或FXML文件并将其放入Library面板

  2. 在"打开"对话框窗口中,导航到要导入的JAR或FXML文件的位置.将显示"导入"对话框,类似于图8-4所示.检查JAR文件的内容,并在对话框窗口中显示被确定为合适的自定义组件的所有Java类.解析FXML文件的内容以确保添加的组件是有效且自包含的.

  3. 在"导入"对话框窗口中,从能够导入的项目列表中选择或取消选择项目.

  4. 单击导入组件.导入的项目将添加到"库"面板的"自定义"部分.它们可以立即使用,即使在重新启动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)

组件先决条件

为了使流程有效,您需要确保以下几点:

  1. 您的组件类扩展了Node.
  2. 您的组件类具有无参数构造函数.
  3. 您的组件类和没有参数构造函数是公共的.
  4. 您的组件类位于包中(例如org.jewelsea) - 它不能没有包集.
  5. 您的组件类打包在一个JAR文件中,该文件已导入到SceneBuilder中,如上所述.

故障排除

如果您在尝试导入JAR时遇到问题,则在尝试进行JAR导入后,可以使用下面记录的JAR分析功能来帮助进行故障排除(这可能有助于或可能仅提供一些含糊不清的信息以使您更加困惑).

jar文件分析