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

Итак, этот пост: Пользовательский компонент FXML (с контроллер) не отображается в диалоговом окне импорта JAR-файла SceneBuilder

В нем говорится, что вы не можете импортировать пользовательские компоненты, которые зависят от сторонних компонентов. Но я не могу в это поверить (это было бы глупо)... Сейчас я изо всех сил пытаюсь создать пользовательский компонент на основе компонентов из библиотеки JFoenix.

Итак, у меня есть этот fxml и контроллер:

Селектаблист.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXListView?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>

<fx:root type="AnchorPane" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <VBox alignment="TOP_CENTER" prefHeight="743.2" prefWidth="400.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <Label fx:id="titleLabel" text="Title" textFill="#000000de">
               <font>
                  <Font name="Roboto Medium" size="36.0" />
               </font>
               <VBox.margin>
                  <Insets bottom="40.0" top="40.0" />
               </VBox.margin>
            </Label>
            <JFXListView fx:id="itemList" prefHeight="660.0" prefWidth="400.0" />
            <JFXButton fx:id="addButton" focusTraversable="false" onAction="#addElement" prefHeight="50.0" prefWidth="500.0" styleClass="addbutton" stylesheets="@application.css" text="+" textFill="#21ce12ad">
               <font>
                  <Font name="Roboto" size="33.0" />
               </font>
            </JFXButton>
         </children>
      </VBox>
   </children>
</fx:root>

SelectableList.java

package de.goehring.components;

import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXListView;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;

import java.io.IOException;

public class SelectableList<T> extends AnchorPane  {

    @FXML
    private Label titleLabel;

    @FXML
    private JFXListView<T> itemList;

    @FXML
    private JFXButton addButton;

    public SelectableList() {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("SelectableList.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);
        try {
            fxmlLoader.load();
        } catch (IOException exception) {
            throw new RuntimeException(exception);
        }
    }


    @FXML
    void addElement() {

    }

}

Что именно я делаю не так. Мой SceneBuilder не распознает этот компонент при импорте в виде jar.


person Sebastian G.    schedule 02.01.2019    source источник
comment
Возможно, связано: stackoverflow.com/questions/50482659/   -  person Slaw    schedule 03.01.2019


Ответы (1)


Соответствующий вопрос, опубликованный @slaw, решил мою проблему.

Чтобы изучить это: вложенные пользовательские узлы SceneBuilder

В общем, если вас затронула эта тема, клонируйте SceneBuilder и начните его отладку, проверив в проекте комплекта класс JarExplorer.

При добавлении трассировки стека через x.printStacktrace() вы видите причину, по которой ваш проект не был загружен.

Так что в моем случае, как упоминалось в сообщении, связанном: вам нужно установить правильный загрузчик классов (и отсутствующая косая черта. Будь прокляты ваши ресурсы Java.)

Вот как теперь выглядит мой конструктор:

    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/SelectableList.fxml"));
    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);
    fxmlLoader.setClassLoader(getClass().getClassLoader());
    try {
        fxmlLoader.load();
    } catch (IOException exception) {
        throw new RuntimeException(exception);
    }

И после этого он работал просто отлично.

Если у кого-то возникли проблемы с запуском проекта scenebuilder:

Используйте IntelliJ. Вы можете нажать на build.gradle и запустить задачу «запустить». Поскольку java 11 требует загрузки модулей в командной строке, вы можете использовать этот метод. В противном случае вы получите сообщение об ошибке «Компоненты JavaFX».

Надеюсь это поможет.

person Sebastian G.    schedule 03.01.2019