Javafx 一个包中的两个类FXMLLoader错误
当我尝试加载与调用加载的控制器位于同一个包中的FXML文件时,我会收到一个ClassNotFound异常,该异常引用正在加载的FXML文件的控制器类。当我尝试从与包含调用控制器的包不同的包加载同名的FXML文件时,该文件将按预期加载 以下是projectselectorcontroller类中的代码。注释代码是导致异常的行Javafx 一个包中的两个类FXMLLoader错误,javafx,Javafx,当我尝试加载与调用加载的控制器位于同一个包中的FXML文件时,我会收到一个ClassNotFound异常,该异常引用正在加载的FXML文件的控制器类。当我尝试从与包含调用控制器的包不同的包加载同名的FXML文件时,该文件将按预期加载 以下是projectselectorcontroller类中的代码。注释代码是导致异常的行 @Override public void Response(KWMessage Message) { if(Message.getType() != -1)
@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;
}
我能够毫不费力地加载与控制器类文件位于同一个包中的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">
因为您已经使用setLocation设置了FXMLLoader的URL,所以不需要使用inputStream调用FXMLLoader。您只需使用fxmlLoader.load() 谢谢你。您是对的,这是一个完全限定名称的问题。ExtendedNode只是一个方便的类,用于将节点和控制器放在一起。
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(location);
:
:
node.setNode((Parent)fxmlLoader.load(location.openStream()));