SceneBuilder - добавить пользовательский компонент, который зависит от сторонних компонентов
Итак, этот пост: пользовательский компонент FXML (с контроллером) не появляется в диалоге SceneBuilder "Import jar"
В нем говорится, что вы не можете импортировать пользовательские компоненты, которые зависят от сторонних компонентов. Но я не могу поверить в это (это было бы глупо) ... Сейчас я изо всех сил пытаюсь создать собственный компонент на основе компонентов из библиотеки 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 ответ
Связанный вопрос, опубликованный @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" отсутствуют.
Надеюсь это поможет.