Как создать файл FXML для уже созданного нового компонента в java, чем добавить его в scene builder?
Я новичок в javaFX. Я создал настраиваемое поле поиска (расширяет текстовое поле) на java, проверьте изображение:
Я тестировал его с помощью тестового класса, и он работает.
Я хочу знать, можно ли создать файл FXML, чем добавить этот компонент в scene builder ? как это сделать ? Спасибо заранее.
1 ответов
как импортировать компонент из JAR в SceneBuilder
Вы можете поместить свой компонент в банку и импортировать его в SceneBuilder. Вам не нужно создавать файл FXML для вашего компонента, чтобы добавить его в Панель библиотеки SceneBuilder.
посмотреть добавление пользовательских компонентов в библиотеку раздел руководства пользователя JavaFX.
для импорта пользовательских компонентов GUI из файла JAR или FXML:
выберите импорт JAR / FXML команда file из меню Панели Library, или перетащите файл JAR или FXML непосредственно из собственного файла системы менеджер (Explorer или Finder) и поместите его в Панель библиотеки
в диалоговом окне открыть перейдите к местоположению JAR или FXML файл, который вы хотите импортировать. Диалоговое окно импорта, аналогичное тому, что показано в рис. 8-4 отображается. Файл JAR содержание проверено и все классы Java, которые определены как в диалоговом окне отображаются подходящие пользовательские компоненты. Этот Содержимое файла FXML анализируется, чтобы убедиться, что компонент добавлено действительно и автономно.
в диалоговом окне импорт выберите или отмените выбор элементов из списка элементов, которые можно импортировать.
клик Импорт Компонентов. импортные товары добавлено к обычаю раздел панели "библиотека". Их можно использовать немедленно и они сохраняйтесь в библиотеке даже после перезапуска 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
);
}
}
компонентные предпосылки
для того чтобы процесс работал, есть несколько вещей, которые вы должны обеспечить:
- компонент класс расширяет узел.
- у вашего класса компонентов нет конструктора аргументов.
- ваш класс компонентов и конструктор аргументов не являются общедоступными.
- ваш класс компонентов находится в пакете (например, org.jewelsea) - он не может иметь никакого пакета.
- ваш класс компонентов упакован в файл JAR, который был импортирован в SceneBuilder, как описано выше.
устранение неисправностей
Если вы имеете проблемы с импортом JAR после попытки импорта JAR вы можете использовать функцию анализа JAR, описанную ниже, для устранения неполадок (которая может помочь или просто предоставить некоторую загадочную информацию, чтобы запутать вас больше).