我看到有很多关于此的帖子,有些是最近发布的,有些是旧发布的。尽管如此,我想分享自己的经验,因为我正面临着这个问题,而且似乎找不到解决办法。
首先,上下文:
情况:
我正在编写一个聊天应用程序。
我有一个MainView
,它分为 3个组件。为了拆分UI逻辑,这三个组件如下:
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);
}
}