2

MVC Swing Java アプリケーションについて質問があります。

たとえば、Entity eロジックのない単純なクラスです。属性とゲッター、セッター、equals、hashCode、toString (または場合によっては compareTo) のみです。MVC のモデルを表します。

私たちが持っているよりもMainWindow(MVCのビューとして)。

を使用e.getSomething();したり、のe.setSomething(someValue);コレクションをソート/反復したりしても問題ありませんか? したがって、コンポーネントリスナーの匿名クラスでGUIレンダリングとアクションを実行します(「ビュー依存」であるため、リスナーの実装はコントローラーにできないと思います-HTMLにはリスナーがありません)?ElementMainWindow

私はでこのようなことをしましたMainWindow

...
final Element el = Controller.getInstance().getSomeElement();
JButton save = new JButton();
JTextField field = new JTextField(el.getSomething());

save.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        el.setSomething(field.getText());
        Controller.getInstance().persist(); //let controller know some Element has changed and needs to be saved
    }
});
...

このコードを MVC に準拠するように変更するにはどうすればよいですか? ありがとう。

4

1 に答える 1

4

厳格なルールはありません。多くの場合、Swing アプリではビューとコントローラーが組み合わされます。

ただし、厳密な MVC では、ビューはコントローラーに依存するべきではありません。ビューは単にモデルをリッスンして自分自身を描画し、そのコンポーネントとイベントをコントローラーに公開します。コントローラーはこれらのイベントに反応し、モデルを適切に変更してビューを変更します。

したがって、あなたの例では、MainWindow に対して次のメソッドを使用します。

public void addSaveListener(ActionListener l) {
    save.addActionListener(l);
}

public void removeSaveListener(ActionListener l) {
    save.removeActionListener(l);
}

さらに、Element のインスタンスを MainWindow コンストラクターに渡し、Controller から取得する必要がないようにします。コントローラーは MainWindow を作成し、独自の参照を渡します。

次に、コントローラーで次のようにします。

myMainWindow.addSaveListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        el.setSomething(field.getText());
        persist(); // Element has changed and needs to be saved
    }
});

大規模なアプリでは、上で書いたものの代わりにイベント バス アーキテクチャを検討しますが、それはおそらく別の問題です。

于 2013-02-15T04:26:40.940 に答える