0

当我尝试加载与调用加载的控制器位于同一包中的 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);
                    }
                });
        }
    }
}

这是加载方法。我检查了网址,发现它是正确的。两个控制器类是否有可能不能驻留在同一个包中?

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

1 回答 1

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

于 2013-02-26T04:01:35.080 回答