1

JavaFX に基づいてEventHandler<T>、特定のアクションのリスナーを作成するのは非常に簡単です。議論のために、コードは次のようになります。

btn.setOnAction(new EventHandler<ActionEvent>() {
    public void handle(ActionEvent event) {
        System.out.println("Hello World");
    }
});

ここで、このイベントでより複雑なものを処理したいとしましょう (50 ~ 100 行のコードが必要だとしましょう)。同じアプローチを使用して、このすべてのコードをハンドラー内、つまりコントローラー内に配置できます。

これを少しすっきりさせたい場合は、EventHandler<T>インターフェイスを実装できます。これは次のようになります。

public class LoginHandler implements EventHandler<ActionEvent> {

    // list of parameters passed

    public LoginHandler(ResourceBundle resources) {
        //Resources along with other paramters I need to access
        this.resources = resources;
    }

    @Override
    public void handle(ActionEvent event) {
        //...Logic goes here
        System.out.println("doing my logic here - 50 to 100 lines");
        ((Node)(event.getSource())).getScene().getWindow().hide();
    }
}

このようなアプローチは機能しますが、すべてのオブジェクト (ボタン、ラベル、テキスト ボックスなど) と ResourceBundle (アプリを国際化しようとする場合) をパラメーターとして渡す必要があります。

このすべての情報にアクセスする方法はありますか? EventHandler基本的に、 ?からコントローラーにアクセスします。それとも、コントローラーにすべてを残すのがベストプラクティスですか?

4

2 に答える 2

1

私の意見では、handleメソッドで実行されるロジックがビュー(つまり、FXMLのコントロール)に関連している場合は、コントローラーに保持する必要があります。コントローラ以外の誰もがFXML構造を知る必要はありません。拡張eventHandlerで一般的で一般的なロジックを実行する場合は、他のパラメーターに加えて、コントローラーインスタンスもこのeventHandlerに渡します。次に、たとえばcontroller.updateView(params)のように、ビュー関連のジョブをコントローラーに委任します。これらのコントローラーは、updateView(params)メソッドのシグネチャを持つ共通のインターフェースを実装することもできます。

于 2013-01-08T16:20:08.343 に答える
1

UI コントロールへのアクセスが必要なユースケースでは、最初の例のように匿名クラスを使用することをお勧めしますが、読みやすさのために長すぎる場合は、いくつかのメソッドを抽出できます。

于 2013-01-09T11:37:57.627 に答える