Вопрос:

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

java javafx fxml scenebuilder

3767 просмотра

1 ответ

58 Репутация автора

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

введите описание изображения здесь

Я проверил это с тестовым классом, и это работает.

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

Автор: ben Источник Размещён: 04.04.2015 09:17

Ответы (1)


12 плюса

118405 Репутация автора

Решение

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

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

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

Чтобы импортировать пользовательские компоненты графического интерфейса из файла JAR или FXML:

  1. Выберите команду « Импортировать файл JAR / FXML» из меню панели «Библиотека» или перетащите файл JAR или FXML непосредственно из собственного файлового менеджера вашей системы (Explorer или Finder) и перетащите его на панель «Библиотека».

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

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

  4. Нажмите Импортировать компоненты. Импортированные элементы добавляются в пользовательский раздел панели «Библиотека». Их можно использовать немедленно и они сохраняются в библиотеке даже после перезапуска Scene Builder.

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

Пример использования импортированного компонента

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

образец поиска

Верхняя панель поиска находится на панели дизайна 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

Автор: jewelsea Размещён: 04.04.2015 09:35
Вопросы из категории :
32x32