2012-06-03 24 views
14

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

スタートアップ:

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

とコントローラクラスは、コードの残りの部分が含まれています。

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

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

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

しかし、私はこれらの部分をどのように接続するのか迷っています。 Viewをインスタンス化する必要はありません。たとえば、Controllerに渡すことのできるViewインスタンスはありません。次に、それらをすべてシングルトンにして、単に実行時に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 gets a View and Model instance in initialize(); 
     // Error: Instantiation and Runtime Exception... 
     PortalController.INSTANCE.initialize(); 
    } 
} 

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

答えて

23

あなた、
- ビューはスタートアップ時のJavaFXプラットフォームが提供する主なStageです。この段階にはScene(作成して設定したもの)のみがあり、親ノードの内容はroot(変数)です。このrootノードはFXMLLoaderによって設定され、 "PortalUI.fxml"ファイルで定義されたレイアウト/ノード構造を表します。
つまり、Stage -> Scene -> PortalUI.fxml(root)はビュー部分を定義します。コントローラ=」 "属性: -

コントローラInitializable、あなたがFXであなたのPortalUI.fxmlファイルで指定されていることを実装するクラスです。あなたが指定したクラス(私が想定しているPortalController)が作成され、FXMLLoaderによってそのメソッドinitialize()が呼び出されます。つまり、PortalUI.fxmlファイルがロードされたときにコントローラが作成されるため、自分で作成して初期化する必要はありません。 FXMLLoaderからコントローラの作成/初期化されたインスタンスを取得するには、Accessing FXML controller classを参照してください。

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

+0

こんにちは!答えをありがとう、リンクも素晴らしいリソースでした!私はコントローラーにアクセスできます。私は今それを理解していると思う。これは私が慣れ親しんできたものとは非常に異なるアーキテクチャです。私を助けてくれてありがとう – IAE

関連する問題