SceneBuilder - добавить пользовательский компонент, который зависит от сторонних компонентов - PullRequest
0 голосов
/ 02 января 2019

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

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

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

SelectableList.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.

1 Ответ

0 голосов
/ 03 января 2019

Связанный вопрос, опубликованный @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» отсутствуют.

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

...