Наследовать от пользовательского элемента управления с помощью fxml

Проект, над которым я работаю, использует фреймворк JavaFx, поэтому мы используем файлы fxml и Scene Builder. Я создал собственный элемент управления для нашего приложения, следуя примерам, найденным в веб-странице, и это прекрасно работает. Однако у нас будет несколько настраиваемых элементов управления с общей базовой функциональностью. Поэтому я хотел бы унаследовать базовую функциональность в пользовательском элементе управления.

Что я пытаюсь сделать, так это создать пользовательский элемент управления, который расширяет пользовательский класс корневого элемента управления. Вот как выглядит файл CustomControl.fxml:

<?import com.custom.CustomRootControl ?>

<fx:root type="CustomRootControl" xmlns:fx="http://javafx.com/fxml">
    /* Add children here... */
</fx:root>

Прямо сейчас мой класс CustomRootControl выглядит так:

public class CustomRootClass extends Pane {
    /* Customization to be performed */
}

Это кожа да кости, и я не ожидаю увидеть многое в Scene Builder, когда открою CustomControl.fxml, но файл fxml не откроется в Scene Builder. Вместо этого я получаю следующее сообщение об ошибке:

java.io.IOException: javafx.fxml.LoadException: <path_to_CustomControl.fxml>

    ...

Caused by: javafx.fxml.LoadException: <path_to_CustomControl.fxml>

    ...

Caused by: java.lang.ClassNotFoundException: com.custom.CustomRootControl
    at java.lang.ClassLoader.findClass(ClassLoader.java:530)
    ...

Есть ли способ сделать то, что я пытаюсь сделать? И если да, то как мне это сделать?


person tomcat    schedule 11.11.2014    source источник
comment
С какой стати кто-то понизил бы этот вопрос.   -  person Mishax    schedule 21.08.2015


Ответы (1)


Вы должны вставить это в свой файл fxml

 <?scenebuilder-classpath-element <path_to_CustomControl.jar>?>
person Mailkov    schedule 11.11.2014
comment
Я не могу заставить это работать. Я использую Maven со структурой проекта по умолчанию. Мой файл fxml находится в каталоге project/src/main/resources/fxml, а мой jar находится в каталоге проекта/цели. Я добавил ‹?scenebuilder-classpath-element ../../../../target?› в свой файл fxml, но все еще получаю ошибку CustomRootControl недопустимого типа LoadException при попытке открыть с помощью SceneBuilder. - person tomcat; 11.11.2014
comment
target.jar — это файл jar, содержащий CustomRootControl ? Он существует? - person Mailkov; 12.11.2014
comment
Мой путь к банке: ../../../../target/MyCustomProject-1.0-SNAPSHOT.jar по отношению к CustomControl.fxml. В дополнение к тому, что я разместил в комментариях, я попробовал ‹?scenebuilder-classpath-element ../../../../target/MyCustomProject-1.0-SNAPSHOT.jar?›. Я нашел альтернативное решение, импортировав MyCustomProject-1.0-SNAPSHOT.jar в папку библиотеки построителя сцен, но я не знаю, какое решение лучше. - person tomcat; 13.11.2014
comment
С помощью ‹?scenebuilder-classpath-element ../../../../target/MyCustomProject-1.0-SNAPSHOT.jar?› открывает ли SceneBuilder ваш файл fxml? - person Mailkov; 13.11.2014
comment
Нет, я получаю исключение LoadException: CustomRootControl недопустимого типа. - person tomcat; 13.11.2014