JavaFX SceneBuilder: ClassNotFoundException при загрузке пользовательского элемента управления - PullRequest
0 голосов
/ 31 августа 2018

Я вижу, что есть много сообщений об этом, некоторые немного недавние, некоторые намного старше. Тем не менее, я хотел бы поделиться своим собственным опытом, потому что я сталкиваюсь с этой проблемой, и я не могу найти решение.

Прежде всего, контекст:

  • Я использую Intellij IDEA Community Edition 20018.2.2 от 21 августа 2018 года
  • Я использую Scene Builder из GLUON, версия 8.5.0 (последняя на этот пост)
  • Я использую 64-битную версию JDK & JRE 8.181 (последняя по состоянию на этот пост)

Ситуация: Я пишу приложение для чата. У меня есть MainView, который разделен на 3 компонента . Чтобы разделить логику пользовательского интерфейса, необходимо выполнить следующие 3 компонента:

  1. ConversationView, который отображает список беседы;
  2. ActiveConversationView, который отображает текущий выбранный разговор со всеми сообщениями;
  3. 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 компонентов, но получил следующую ошибку:

enter image description here

Наконец, последний пункт: каждый из этих компонентов не содержит вложенных пользовательских элементов управления. Таким образом, только 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);
        }
    }
...