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

oalqel3c  于 2023-05-27  发布在  Java
关注(0)|答案(1)|浏览(197)

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

我用一个测试类测试了它,它工作正常。
我想知道现在是否有可能创建它的FXML文件,而不是将此组件添加到场景生成器?怎么做?先谢谢你了。

yebdmbv4

yebdmbv41#

SceneBuilder 19的更新指南

有关创建自定义组件库并将其导入SceneBuilder 19的示例(包含示例代码和屏幕截图),请参阅:

此答案中关于创建自定义组件的许多要点仍然适用于以后的SceneBuilder版本,但有一些新的替代方法可以查找和导入JAR文件(其中一些方法的使用在上面的链接答案中进行了演示)。

如何将JAR中的组件导入场景构建器

您可以将组件放入Jar中并将其导入SceneBuilder。无需为组件创建FXML文件即可将其添加到SceneBuilder库面板。
请参阅JavaFX用户指南的Adding Custom Components to the Library部分。

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

1.从“库”面板的菜单中选择导入JAR/FXML文件命令,或直接从系统的本机文件管理器(资源管理器或Finder)中拖动JAR或FXML文件并将其拖放到“库”面板中
1.在“打开”对话框窗口中,定位到要导入的JAR或FXML文件的位置。此时将显示与图8-4所示类似的“导入”对话框。JAR文件的内容将被检查,所有被确定为合适的自定义组件的Java类都将显示在对话框窗口中。将分析FXML文件的内容,以确保添加的组件有效且自包含。
1.在“导入”对话框窗口中,从能够导入的项目列表中选择或取消选择项目。
1.单击**导入组件。**导入的项目将添加到“库”面板的“自定义”部分。它们可以立即使用,并且即使在场景生成器重新启动后也会保留在库中
请注意,SceneBuilder还支持导入基于FXML的组件,而不仅仅是直接的代码组件。这个答案只讨论导入不包含FXML的纯代码组件。

导入组件使用示例

下面是一个自定义搜索字段组件,我使用上面概述的方法导入到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
        );
    }
}

组件先决条件

为了使该过程正常工作,您需要确保以下几点:
1.组件类扩展Node。
1.你的组件类有一个无参数构造函数。
1.你的组件类和无参数构造函数是公共的。
1.您的组件类位于一个包中(例如org.jewelsea)-它不能没有包集。
1.组件类打包在JAR文件中,该文件已导入到SceneBuilder中,如上所述。

  • JAR使用不高于SceneBuilder使用的JDK版本进行编译,并且依赖于不高于SceneBuilder使用的JavaFX版本。
  • 例如,SceneBuilder 19在JDK 17上运行,并使用JavaFX 19,因此必须编译JAR,使其目标Java运行时不高于17,并依赖于不高于19的JavaFX版本。
    故障排除

如果在尝试JAR导入后,您在导入JAR时遇到问题,您可以使用下面介绍的JAR分析功能来帮助进行故障排除(这可能会有所帮助,也可能只是提供一些模糊的信息,使您更加困惑)。

此外,从这个答案:

尝试从命令行启动场景生成器,您应该看到库导入的输出,包括添加自定义控件时可能出现的异常。

相关问题