Я вижу, что есть много сообщений об этом, некоторые немного недавние, некоторые намного старше. Тем не менее, я хотел бы поделиться своим собственным опытом, потому что я сталкиваюсь с этой проблемой, и я не могу найти решение.
Прежде всего, контекст:
- Я использую Intellij IDEA Community Edition 20018.2.2 от 21 августа 2018 года
- Я использую Scene Builder из GLUON, версия 8.5.0 (последняя на этот пост)
- Я использую 64-битную версию JDK & JRE 8.181 (последняя по состоянию на этот пост)
Ситуация:
Я пишу приложение для чата.
У меня есть MainView
, который разделен на 3 компонента . Чтобы разделить логику пользовательского интерфейса, необходимо выполнить следующие 3 компонента:
-
ConversationView
, который отображает список беседы;
-
ActiveConversationView
, который отображает текущий выбранный разговор со всеми сообщениями;
-
ToolBarView
, который находится в верхней части окна и отображает некоторые значки с конкретными действиями.
Работать с этими компонентами по отдельности можно, как встроенный Scene Builder (в Intellij), так и GLUON Scene Builder открывают FXML и отображают содержимое.
Как вы поймете, MainView FXML очень прост:
<fx:root minHeight="-Infinity" minWidth="-Infinity" prefHeight="720.0" prefWidth="1280.0" type="AnchorPane" xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1">
<children>
<ToolBarView fx:id="toolBarView" minHeight="-Infinity" minWidth="-Infinity" prefHeight="72.0" prefWidth="1280.0" AnchorPane.bottomAnchor="648.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
<ConversationsView fx:id="conversationsView" minHeight="-Infinity" minWidth="-Infinity" prefHeight="648.0" prefWidth="320.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="960.0" AnchorPane.topAnchor="72.0" />
<ActiveConversationView fx:id="activeConversationView" prefHeight="648.0" prefWidth="960.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="320.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="72.0" />
</children>
</fx:root>
В качестве точности я работаю с использованием шаблона MVVM, поэтому все представления имеют свои соответствующие модели представлений вплоть до каждой ячейки в каждом списке.
После некоторой работы я хотел вернуться к файлу макета MainView, чтобы внести некоторые изменения, и там у меня возникла проблема:
Причина: java.lang.ClassNotFoundException:
myproject.view.main.activeconversation.ActiveConversationView
Так как GLUON Scene Builder не смог загрузить мой макет, я попытался сделать это с помощью встроенного Scene Builder, и он отлично работает.
Я хочу, чтобы кто-то помог мне понять, почему GLUON Scene Builder не открывает мой MainView
. Я знаю, что могу продолжать использовать встроенный Scene Builder, но он медленный, а отставание и компоновка слишком ограничены.
Я даже пытался вручную добавить относительный файл FXML компонентов, но получил следующую ошибку:
Наконец, последний пункт: каждый из этих компонентов не содержит вложенных пользовательских элементов управления. Таким образом, только MainView
содержит 3 пользовательских элемента управления.
И каждый из этих конструкторов компонентов опирается на один и тот же код (например, ConversationView
):
public ConversationsView() {
this.viewModel = new ConversationsViewModel();
final FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("ConversationsLayout.fxml"));
fxmlLoader.setClassLoader(getClass().getClassLoader()); // I read on another SO post that this could solve the problem, but it does not.
fxmlLoader.setController(this);
fxmlLoader.setRoot(this);
try {
fxmlLoader.load();
} catch (final IOException ioe) {
throw new RuntimeException(ioe);
}
}