0

ロードを呼び出しているコントローラーと同じパッケージにある FXML ファイルをロードしようとすると、ロードされている FXML ファイルのコントローラー クラスを参照する ClassNotFound 例外が発生します。呼び出し元のコントローラーを含むパッケージとは異なるパッケージから同じ名前の 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を確認したところ、正しいことがわかりました。2 つのコントローラー クラスが同じパッケージに存在できない可能性はありますか?

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 に答える