MVPデザインパターンを使用してJavaでGUIアプリケーションを作成しています。 JButton
オブジェクトはViewクラスに属し、ActionListener
オブジェクトはPresenterに属します。私はViewのJButtonオブジェクトをPresenterに公開する簡潔な方法
JButtons
(1)ボタン
public
と(2)を作るのいずれかなしに
ActionListener
Sを追加できるようにする簡潔な方法を探しています
private JButton foo;
private JButton bar;
public void addActionListenerToButtonFoo(ActionListener l) {
foo.addActionListener(l);
}
public void addActionListenerToButtonBar(ActionListener l) {
bar.addActionListener(l);
}
// (imagine typing 10 more of these trivial functions and having
// them clutter up your code)
私は合理的によく働く一つの技術が見つかりました:このラッパーはうまく機能
public class View {
class WrappedJButton {
private JButton b;
public WrappedJButton(String name){
this.b = new JButton(name);
}
public void addActionListener(ActionListener l) {
b.addActionListener(l);
}
}
public final WrappedJButton next = new WrappedJButton("Next");
public final WrappedJButton prev = new WrappedJButton("Previous");
public void setup() {
JPanel buttons = new JPanel();
buttons.setLayout(new FlowLayout());
buttons.add(previous.b);
buttons.add(next.b);
}
} // end view
class Presenter {
public Presenter() {
View view = new View();
view.next.addActionListener(event -> {
// Respond to button push
});
}
} // end Presenter
を。ラップされたボタンをpublic
にすると、Presenterはそれらを名前で参照できます(これにより、IDEでコード補完を使用できるようになります)。しかし、オブジェクトがWrappedJButton
なので、プレゼンターが行うことができるのは、ActionListenerを追加することだけです。ビューは、プライベートb
フィールドを介して「実際の」ボタンをつかむことによって、オブジェクトへの「フル」アクセスを得ることができます。
質問:
- より良い/クリーナー解決策はありますか?おそらく何か ビューの
b
フィールドにアクセスする必要性を排除するでしょうか? - このソリューションを一般化する方法はありますか? カット&ペースト
WrappedJButton
私が書いた各ビュークラスには?私はWrappedJButton
をインタフェース( の実装)に移動しようとしました。しかし、私がそうすると、Viewは プライベートb
フィールドにアクセスできなくなりました。