1

私は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からの回答に基づいて、階層について言及するときは、キーバインディングの処理方法と同様の意味であることを明確にする必要があります(つまり、バインディングがありますか?いいえ、コンテナにバインディングがありますか?...まで実際のクラス階層ではなく、誰かがキーイベントを消費します。

4

2 に答える 2

2

機能をカプセル化する方法として、 「ツールバーの使用方法」で説明されていると、 「アクションの使用方法」JToolBarで説明されているを組み合わせることを検討してください。ここで引用した例は、単一のツールバーをエクスポートします。対照的に、ここに示されているは、テキストコンポーネントの現在の選択に適用されるサブタイプのファミリをエクスポートします。ActionStyledEditorKitAction

于 2012-10-30T13:46:23.620 に答える
1

デザインはかなり良いですが、ツールバーの階層を作成すると、特定のボタンが特定のツールバーでクリックされた状況では、そのボタンに対して実行された対応するアクションが正確でない場合があります。また、複数のイベントがトリガーされる場合もあります。また、どのスーパークラスに属するべきかを特定するのが難しいツールバーや、複数のツールバーから機能を実装している場合は、Javaがサポートしていない多重継承が必要なツールバーもあります。

おそらく、ストラテジーパターンとファクトリパターンの組み合わせでこれらの問題を解決できる可能性があります。これを再考してソリューションを設計してください。申し訳ありませんが、質問の正確な設計やソースがありません。ソリューションについて考えたところです。

よろしく、ヤシュ

于 2012-10-30T09:51:20.333 に答える