Java

アクション

Swing のその他の変更

ActionEvent ソースへのアクション追加用 API

背景

Swing は、アプリケーション開発者が機能を集中化して、GUI の複数の場所からその機能にアクセスできるようなコマンドパターンの実装を提供します。Action インタフェースは、ActionListener を提供するために使用されます。 ActionListener は、ツールバー、メニュー項目、およびキーボードバインドからアクセス可能な機能の実装を提供できます。Action の状態が (無効にされるなどして) 変化すると、対応制御もそれに応じて (無効にされるなどして) 変化します。

問題

Action が意図したとおりに機能するためには、次の接続を作成する必要があります (Action がすでに作成されていることが前提)。
  1. コントロールを作成する必要があります。
  2. Action はコントロール上に ActionListener として追加されます。
  3. PropertyChangeListener が作成されます。これは、Action 上の PropertyChangeEvent に応答してコントロールの更新方法を規定します。
  4. PropertyChangeListener がリスナーとして Action 上に追加されます。
  5. 元に戻してガベージコレクションを可能にするために、リンケージに関する情報の保持が必要とされる場合があります (1.2 では、これは WeakRefs を使って自動的に処理される)。
一般的なアプリケーションは 5 から 25 の Action を保持し、各 Action は 2 から 3 のコントロールを保持するため、上記の手順は多い場合 75 回も実行する必要があります。

開発者にとっての負荷を大幅に軽減するため、Action の潜在的な Container に対してヘルパーメソッドを使用することにより、自動処理を実行する方法が用意されました。現在のところ、Swing で自動処理を実行できることが明らかになっているのは次の 3 か所です。

JToolBar.java public JButton add(Action a)
JMenu.java public JMenuItem add(Action a)
JPopupMenu.java public JMenuItem add(Action a)

この方法には、いくつかの問題があります。

  1. ビルダにとって、これは大きな問題になります。 ビルダは Container.add() をオーバーロードして、それ自体が追加されて終了するわけではない非 Component パラメータを許可するためです。
  2. 開発者は、コンテナクラスをサブクラス化することなく作成されたコントロールの構成に関係することはできません。
  3. サブクラス化したとしても、構成の粒度は、追加されたコントロール単位ではなく、Container 単位になります。
  4. これにより、開発者は、Action が許可する ActionEvent ソースの全範囲ではなく、Container ごとの目的のコントロールに制限されます。

解決法

多くの開発者からのコメントによると、ActionEvent ソースである独自のコントロールを作成してから、コントロールを特定の Action に接続するメソッドを保持することが望まれています。解決法は、この要望に沿ったもので、同時に上記の欠点の解決にも取り組んでいます。

追加された API は、まず AbstractButton に追加されます。 これは、JButtonJMenuItemJMenuJCheckBox などの抽象スーパークラスです。

新規 public メソッドは、次のとおりです。

さらに、提供されたアクションを使ってコントロールを直接作成することを可能にする ActionEvent ソースにコンストラクタが追加されています。

JButton では、次のメソッドです。

同等のコンストラクタが、以下に追加されました。 注 :

JToolBar、JPopupMenu、JMenu 用の createAction ファクトリメソッド

新規ファクトリメソッドを使用すると、アクションが (add メソッドを使って) 直接追加された場合に、ツールバーおよびメニューの作成内容を制御できます。

JToolBar への追加:

JPopupMenu への追加: JMenu への追加:

新規アクション定数

以下を参照してください。

AbstractAction への getKeys メソッドの追加

この新規メソッドは AbstractAction の直列化に必要なメソッドで、開発者が AbstractAction 用に設定されたキーを調査する手段を提供します。

以下を参照してください。


Copyright ©1999 Sun Microsystems, Inc. All Rights Reserved.

コメントの送付先: swing-feedback@java.sun.com.これは購読リストではありません。
Sun
Java ソフトウェア