14

私はJavaFXを初めて使用し、現在の設定では適切なMVCアーキテクチャを作成するのに苦労しています。Scene Builderを使用してUIを一緒にクリックし、Controllerクラスを指定しました。

起動:

public class Portal extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("PortalUI.fxml"));

        stage.setTitle("Portal");
        stage.setScene(new Scene(root));
        stage.show();
    }
}

また、Controllerクラスには残りのコードが含まれています。

public class AccommodationPortalView implements Initializable {
    @Override
    public void initialize(URL url, ResourceBundle resources) {
    // Work here.
    }
}

私の教授は、このアプリケーションの懸念と責任をさらに分離するように求めました。コントローラは、状態を管理してバックエンドと通信するだけでなく、ビューを更新します。

私の最初の応答は、ControllerクラスをViewにし、ControllerとModel用に他の2つのクラスを作成することでした。

しかし、私はこれらの部品をどのように接続するか途方に暮れています。ビューをインスタンス化する必要がないため、たとえば、コントローラーに渡すことができるビューインスタンスはありません。次に、それらをすべてシングルトンにして、実行時にコントローラーにフェッチさせようとしましたが、エラーが発生します。

public class Portal extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("PortalUI.fxml"));

        stage.setTitle("Portal");
        stage.setScene(new Scene(root));
        stage.show();

        // Controller gets a View and Model instance in initialize();
        // Error: Instantiation and Runtime Exception...
        PortalController.INSTANCE.initialize();
    }
}

現在の構成を使用してMVCパターンを適切に設定するにはどうすればよいですか?別のアーキテクチャが必要ですか?

4

1 に答える 1

24

Your、
-Viewは、起動時にJavaFXプラットフォームによって提供されるプライマリですStageこのステージにSceneは、親ノードのコンテンツroot(変数)を持つ唯一の(作成および設定した)ステージがあります。このrootノードはFXMLLoaderによって設定され、「PortalUI.fxml」ファイルで定義されたレイアウト/ノード構造を表します。
つまりStage -> Scene -> PortalUI.fxml(root)、ビューパーツを定義します。

--Controllerは、PortalUI.fxmlファイルでfx:controller = ""属性を使用して実装し、指定したクラスです。そこで指定したクラス(PortalControllerだと思います)が作成され、FXMLLoaderによってそのメソッドが呼び出されます。つまり、PortalUI.fxmlファイルがロードされるときにコントローラーが作成されるため、自分で作成して初期化する必要はありません。FXMLLoaderからコントローラーの作成/初期化されたインスタンスを取得するには、AccessingFXMLコントローラークラスを参照してください。 Initializableinitialize()

--モデルは、コントローラーによって保存および管理される基礎となるデータ構造です。「データ」を表すものであれば何でもかまいません。たとえば、Person、PortalInfoなどのクラス。

于 2012-06-03T21:20:51.573 に答える