Как создать файл FXML для уже созданного нового компонента в java, чем добавить его в scene builder?

Я новичок в javaFX. Я создал настраиваемое поле поиска (расширяет текстовое поле) на java, проверьте изображение:

enter image description here

Я тестировал его с помощью тестового класса, и он работает.

Я хочу знать, можно ли создать файл FXML, чем добавить этот компонент в scene builder ? как это сделать ? Спасибо заранее.

1 ответов


как импортировать компонент из JAR в SceneBuilder

Вы можете поместить свой компонент в банку и импортировать его в SceneBuilder. Вам не нужно создавать файл FXML для вашего компонента, чтобы добавить его в Панель библиотеки SceneBuilder.

посмотреть добавление пользовательских компонентов в библиотеку раздел руководства пользователя JavaFX.

для импорта пользовательских компонентов GUI из файла JAR или FXML:

  1. выберите импорт JAR / FXML команда file из меню Панели Library, или перетащите файл JAR или FXML непосредственно из собственного файла системы менеджер (Explorer или Finder) и поместите его в Панель библиотеки

  2. в диалоговом окне открыть перейдите к местоположению JAR или FXML файл, который вы хотите импортировать. Диалоговое окно импорта, аналогичное тому, что показано в рис. 8-4 отображается. Файл JAR содержание проверено и все классы Java, которые определены как в диалоговом окне отображаются подходящие пользовательские компоненты. Этот Содержимое файла FXML анализируется, чтобы убедиться, что компонент добавлено действительно и автономно.

  3. в диалоговом окне импорт выберите или отмените выбор элементов из списка элементов, которые можно импортировать.

  4. клик Импорт Компонентов. импортные товары добавлено к обычаю раздел панели "библиотека". Их можно использовать немедленно и они сохраняйтесь в библиотеке даже после перезапуска Scene Builder

Примечание, SceneBuilder также поддерживает импорт компонентов на основе FXML, а не только компонентов прямого кода. В этом ответе рассматривается только импорт компонентов кода, которые не содержат FXML.

Пример Использования Импортированных Компонентов

здесь пользовательский компонент поля поиска, который я импортировал в SceneBuilder, используя описанный выше метод.

search sample

верхняя панель поиска находится в области дизайна Scene Builder, нижняя панель поиска является результатом использования функции предварительного просмотра Scene Builder и поиска счастья.

Образец SceneBuilder Сгенерированный Код

файл fxml, который был создан SceneBuilder на основе дизайна, включен здесь. Заметьте, это было просто тестовая сцена, созданная с помощью 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. компонент класс расширяет узел.
  2. у вашего класса компонентов нет конструктора аргументов.
  3. ваш класс компонентов и конструктор аргументов не являются общедоступными.
  4. ваш класс компонентов находится в пакете (например, org.jewelsea) - он не может иметь никакого пакета.
  5. ваш класс компонентов упакован в файл JAR, который был импортирован в SceneBuilder, как описано выше.

устранение неисправностей

Если вы имеете проблемы с импортом JAR после попытки импорта JAR вы можете использовать функцию анализа JAR, описанную ниже, для устранения неполадок (которая может помочь или просто предоставить некоторую загадочную информацию, чтобы запутать вас больше).

jar file analysis