私はGUIデザインに熟練していません。よく考え、研究し、実験した後、私はいくつかのデザインのアイデアを開発しましたが、それでも効率的と思われるものはありません。1つのデザインでは、Session godオブジェクトが作成時にすべてのUI要素にリスナーを登録し、アクションを処理するすべてのオブジェクトがSessionオブジェクトにリスナーを登録します。すべてのメッセージングが中央の場所を通過するため、これは単純で堅牢なように見えます。そのため、何かが失われる可能性は低くなります。しかし、それはブルートフォースであり、面倒で非効率的なようです。
別の設計では、相互に通信するオブジェクトのサブグループを作成しようとします。これにより、巨大なトップレベルセッションが回避され、より効率的に見えますが、エラーが発生しやすくなります。
関連する目的のボタンをツールバーにグループ化し、リスナーに関連する操作でツールバーによって実行されるアクションをリッスンする階層的なアプローチを持つ、再利用のためのフレームワークを実装しようとしています。私はこれまでにこれに到達しました:
public class EditorToolBar extends JToolBar {
public static enum Command {
ZOOMIN,
ZOOMOUT,
FINER,
COARSER,
RESET
}
private ButtonCommandListener listener = new ButtonCommandListener();
public EditorToolBar() {
super("Editor Commands");
JButton button;
for (final Command cmd : Command.values()) {
button = new JButton(cmd.toString());
button.setEnabled(true);
button.setToolTipText(cmd.toString() + " Command");
button.setActionCommand(cmd.toString());
button.addActionListener(listener);
add(button);
}
}
public void addActionListener(ActionListener pNewListener) {
listener.cActionNotifier.addListener(pNewListener);
}
private class ButtonCommandListener implements ActionListener {
private NotifierImp<ActionListener> cActionNotifier = new NotifierImp<ActionListener>();
public void actionPerformed(ActionEvent pEvent) {
for (ActionListener listener : cActionNotifier) {
listener.actionPerformed(pEvent);
}
}
}
} // class EditorTooBar
リスナーは次のようなものを実装します。
public void actionPerformed(ActionEvent pEvent) {
switch (EditorToolBar.Command.valueOf(pEvent.getActionCommand())) {
case ZOOMIN:
// do something
break;
case ZOOMOUT:
// do something
break;
case FINER:
// do something
break;
case COARSER:
// do something
break;
case RESET:
// do something
break;
default:
System.out.println("Unknown EditorToolBar Command: "+pEvent.getActionCommand());
return;
}
列挙型のインストラクターを拡張して、ツールチップテキスト、画像なども含めることができます。このデザインを、他のツールバーを説明する別の列挙型で再利用したいと思います。リスナーは、ActionEvent.getActionCommand()を使用してさまざまなボタンアクションを区別し、Command.toValue(String)を使用します。これをリッスンしているクラスの階層に拡張したいと思います。スーパークラスはあるタイプのツールバーのリスナーを実装し、サブクラスは別のツールバータイプをリッスンすることでそれに追加します。イベントがサブクラスが関心のあるツールバーからのものでない場合、イベントをスーパークラスに転送できます。これを機能させるには、あるツールバーと別のツールバーを区別する方法が必要ですが、できれば、そのツールバーから可能なすべてのボタンイベントをチェックする必要はありません。理想的には、ツールバーファクトリが必要です。列挙型を指定するだけで、ツールバーを完全に説明できます。列挙型をサブクラス化できないことは、ここでの課題に追加されます。
これは、追求する有望なデザインパターンですか?まだどこにも見たことがありません。劣ったものを発明するよりも、私が使うべきより良い方法はありますか?他のオプションへのリンクを歓迎します。
編集: yash ahujaからの回答に基づいて、階層について言及するときは、キーバインディングの処理方法と同様の意味であることを明確にする必要があります(つまり、バインディングがありますか?いいえ、コンテナにバインディングがありますか?...まで実際のクラス階層ではなく、誰かがキーイベントを消費します。