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

时间:2015-04-04 09:17:23

标签: java javafx fxml scenebuilder

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

enter image description here

我用测试课测试了它并且它正在工作。

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

1 个答案:

答案 0 :(得分:12)

如何将组件从JAR导入SceneBuilder

您可以将组件放入Jar中并将其导入SceneBuilder。您不需要为组件创建FXML文件,以将其添加到SceneBuilder库面板。

请参阅JavaFX用户指南的Adding Custom Components to the Library部分。

  

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

     
      
  1. 从“库”面板的菜单中选择导入JAR / FXML 文件命令,或者   直接从系统的本机文件中拖动JAR或FXML文件   经理(资源管理器或Finder)并将其放入“库”面板

  2.   
  3. 在“打开”对话框窗口中,导航到JAR或FXML的位置   要导入的文件。导入对话框,类似于什么   显示Figure 8-4中显示的内容。 JAR文件的内容是   检查和确定为的所有Java类   适当的自定义组件显示在对话框窗口中。该   解析FXML文件的内容以确保组件正在进行   添加有效且独立。

  4.   
  5. 在“导入”对话框窗口中,从列表中选择或取消选择项目   您可以导入的项目。

  6.   
  7. 单击导入组件。导入的项目将添加到“自定义”   “库”面板的一部分。它们可以立即使用,也可以使用   即使在重新启动Scene Builder后仍保留在库中

  8.   

注意,SceneBuilder还支持导入基于FXML的组件,而不仅仅是直接代码组件。本回答仅讨论仅导入不包含FXML的代码组件。

示例导入的组件使用

以下是我使用上述方法导入SceneBuilder的自定义搜索字段组件。

search sample

顶部搜索面板位于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
        );
    }
}

组件先决条件

为了使流程有效,您需要确保一些事项:

  1. 您的组件类扩展了Node。
  2. 您的组件类有一个无参数构造函数。
  3. 您的组件类和没有参数构造函数是公共的。
  4. 您的组件类位于包中(例如org.jewelsea) - 它无法设置包。
  5. 您的组件类打包在一个JAR文件中,该文件已导入到SceneBuilder中,如上所述。
  6. <强>疑难解答

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

    jar file analysis