Пользовательский компонент 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

Чтобы подвести итог:

  1. Создайте файл FXML и класс Java, который расширяет корневой узел (я дал им то же имя)
  2. Измените файл FXML, чтобы иметь fx:root в качестве базового узла. (не будет работать без этого)
  3. Удалить fx:controller атрибут (не будет работать без этого)
  4. Скомпилируйте и добавьте банку в конструктор сцены

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

Ниже приведен минимальный рабочий пример

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() {
    }
}
Другие вопросы по тегам