Пользовательский компонент FXML (с контроллером) не отображается в диалоговом окне "Импорт Jar" SceneBuilder
Я следую за этим при создании пользовательского компонента и его импорте. Однако, когда он попадает в диалог импорта после щелчка по файлу jar, он не появляется. Когда я закомментирую код, используемый в руководстве для конструктора, он появится снова. Тем не менее, ни один из подкомпонентов, которые я использовал, чтобы появился пользовательский. Почему и как мне это исправить?
Кроме того, я использую VBox вместо AnchorPane (как видно из учебника) для своей собственной вещи.
Код конструктора, как видно из учебника:
public CommodityImageLabel() {
FXMLLoader fxmlLoader = new FXMLLoader(
getClass().getResource("/fxml/CommodityImageLabel.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
Код для конструктора моего собственного примера:
public While() {
FXMLLoader fxmlLoader = new FXMLLoader(
getClass().getResource("BlocksFXML/While.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
Edit1: я попытался закомментировать части кода, и когда я закомментировал часть try-catch, он заставляет компонент появляться в диалоге, но он все еще не показывает подкомпоненты.
Редактировать 2: пользовательский компонент - это, по сути, VBox, содержащий Hbox с меткой и TextField. Вот как это должно выглядеть по сравнению с тем, что в итоге будет выглядеть, когда он успешно импортируется без части try-catch.
1 ответ
Я решил это, используя информацию здесь:
http://www.cuchazinteractive.com/blog/custom-javafx-controls-and-scene-builder
Чтобы подвести итог:
- Создайте файл FXML и класс Java, который расширяет корневой узел (я дал им то же имя)
- Измените файл FXML, чтобы иметь
fx:root
в качестве базового узла. (не будет работать без этого) - Удалить
fx:controller
атрибут (не будет работать без этого) - Скомпилируйте и добавьте банку в конструктор сцены
Однако я обнаружил, что если ваш пользовательский элемент управления зависит от элементов управления из других библиотек, он потерпит неудачу, даже если другая библиотека загружена в конструктор сцен.
Ниже приведен минимальный рабочий пример
FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>
<fx:root id="AnchorPane" prefHeight="73.0" prefWidth="112.0" type="AnchorPane" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.111">
<children>
<Button layoutX="25.0" layoutY="28.0" mnemonicParsing="false" text="Button" />
</children>
</fx:root>
Джава:
package my.amazing.controls;
import java.io.IOException;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.AnchorPane;
public class TestControl extends AnchorPane {
public TestControl() throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("TestControl.fxml"));
loader.setRoot(this);
loader.setController(this);
loader.load();
}
@FXML
public void initialize() {
}
}