当我尝试加载与调用加载的控制器位于同一个包中的FXML文件时,我得到一个ClassNotFound异常,引用正在加载的FXML文件的控制器类。当我尝试从与包含调用控制器的包不同的包中加载具有相同名称的FXML文件时,文件按预期加载。
以下是projectselectorcontroller类的代码。注释代码是导致异常的行。
@Override
public void Response(KWMessage Message)
{
if(Message.getType() != -1)
{
switch(Message.getType())
{
case 6000:
Platform.runLater(new Runnable()
{
@Override
public void run()
{
//This file loads as expected
ExtendedNode node = mainController.load("/newproject/newproject.fxml");
//This file does not load
//ExtendedNode node = mainController.load("/projectselector/newproject.fxml");
NewProjectController controller = (NewProjectController)node.getController();
mainController.setCurrentNode(node);
}
});
}
}
}
这是加载方法。我检查了URL并发现它是正确的。是否有可能两个控制器类不能驻留在同一个包中?
public ExtendedNode load(String FXML)
{
ExtendedNode node;
URL location = getClass().getResource(FXML);
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(location);
fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
try
{
node = new ExtendedNode();
node.setNode((Parent)fxmlLoader.load(location.openStream()));
node.setController((iMainController)fxmlLoader.getController());
node.getController().setMainController(this);
}
catch (IOException ex){node = null;}
return node;
}
答案 0 :(得分:0)
我能够毫无困难地加载位于与控制器类文件相同的包中的FXML文件。我同样能够加载相对于控制器类所在的另一个可用包中的FXML文件。
加载FXML标记时ClassNotFound异常的常见原因是没有正确命名标记文件的根级别节点中的控制器类。您需要在fx:controller属性中使用完全限定的Java对象名称,例如:
<AnchorPane id="AnchorPane" fx:id="ServicesEditor" maxHeight="-Infinity" maxWidth="-Infinity"
minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0"
styleClass="stage-pane" xmlns:fx="http://javafx.com/fxml"
fx:controller="org.kkk.mm.censusassistant.GUIServicesEditorController">
我首先会检查两个位置的标记文件,以确保它们都具有控制器类的完全限定Java名称,并且两者都标识了正确的类。
如果在项目命名空间中正确识别了控制器类,并且仍然遇到ClassNotFound异常,那么我需要更多上下文来帮助您。您确定它是生成此错误的fxmlloader.load()方法调用吗?如果不是......
您显示的加载标记的逻辑似乎令人费解。我不确定ExtendedNode对象在做什么或者为什么要使用它们。
您正在使用:
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(location);
:
:
node.setNode((Parent)fxmlLoader.load(location.openStream()));
因为您已经使用setLocation设置了FXMLLoader的URL,所以您不需要使用inputStream调用fxmlLoader。您只需使用fxmlLoader.load();
即可