加载自定义控件时,JavaFX SceneBuilder:ClassNotFoundException

时间:2018-08-31 14:31:58

标签: java javafx javafx-8 fxml scenebuilder

我看到有很多关于此的帖子,有些是最近发布的,有些是旧发布的。尽管如此,我想分享自己的经验,因为我正面临着这个问题,而且似乎找不到解决办法。

首先,上下文:

  • 我从2018年8月21日开始使用Intellij IDEA社区版20018.2.2
  • 我使用的是8.5.0版的GLUON中的Scene Builder(截至本文发布时为最新版本)
  • 我使用的是JDK和JRE 64位版本8.181(本文最新发布)

情况: 我正在编写一个聊天应用程序。 我有一个MainView,它分为 3个组件。为了拆分UI逻辑,这三个组件如下:

  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);
        }
    }

0 个答案:

没有答案