アクション |
Swing のその他の変更 |
ActionEvent ソースへのアクション追加用 API
背景
Swing は、アプリケーション開発者が機能を集中化して、GUI の複数の場所からその機能にアクセスできるようなコマンドパターンの実装を提供します。Action
インタフェースは、ActionListener
を提供するために使用されます。ActionListener
は、ツールバー、メニュー項目、およびキーボードバインドからアクセス可能な機能の実装を提供できます。Action
の状態が (無効にされるなどして) 変化すると、対応制御もそれに応じて (無効にされるなどして) 変化します。問題
Action
が意図したとおりに機能するためには、次の接続を作成する必要があります (Action
がすでに作成されていることが前提)。一般的なアプリケーションは 5 から 25 の
- コントロールを作成する必要があります。
Action
はコントロール上にActionListener
として追加されます。PropertyChangeListener
が作成されます。これは、Action
上のPropertyChangeEvent
に応答してコントロールの更新方法を規定します。PropertyChangeListener
がリスナーとしてAction
上に追加されます。- 元に戻してガベージコレクションを可能にするために、リンケージに関する情報の保持が必要とされる場合があります (1.2 では、これは WeakRefs を使って自動的に処理される)。
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)
この方法には、いくつかの問題があります。
- ビルダにとって、これは大きな問題になります。 ビルダは
Container.add()
をオーバーロードして、それ自体が追加されて終了するわけではない非Component
パラメータを許可するためです。- 開発者は、コンテナクラスをサブクラス化することなく作成されたコントロールの構成に関係することはできません。
- サブクラス化したとしても、構成の粒度は、追加されたコントロール単位ではなく、
Container
単位になります。- これにより、開発者は、
Action
が許可するActionEvent
ソースの全範囲ではなく、Container
ごとの目的のコントロールに制限されます。解決法
多くの開発者からのコメントによると、ActionEvent
ソースである独自のコントロールを作成してから、コントロールを特定のAction
に接続するメソッドを保持することが望まれています。解決法は、この要望に沿ったもので、同時に上記の欠点の解決にも取り組んでいます。追加された API は、まず AbstractButton に追加されます。 これは、
JButton
、JMenuItem
、JMenu
、JCheckBox
などの抽象スーパークラスです。新規 public メソッドは、次のとおりです。 さらに、提供されたアクションを使ってコントロールを直接作成することを可能にする ActionEvent ソースにコンストラクタが追加されています。
JButton では、次のメソッドです。
同等のコンストラクタが、以下に追加されました。 注 :
setAction
は、開発者の便宜のために上記のリンケージ処理を実行する単なるヘルパーメソッドです。- 開発者が、進行中のコントロールに対する
Action
を頻繁に切り替えることは考慮されていません。ただし、setAction
を使用して切り替えを行うことは可能です。setAction
は、以前に設定されたアクションを置き換えてPropertyChangeEvent
を発生させるためです。- これは、
ActionListener
を追加する標準メソッドを置き換えるものではないため、上記のaddActionListener()
を使用することに留意してください。- 上に示した現在の
Container
API が、setAction に関して再実装されて、以前と同じ動作を提供できるようにします。これにより、コードの保守が容易になります。configurePropertiesFromAction
メソッドおよびcreateActionPropertyChangeListener
メソッドは、必要なデフォルト動作を提供するためにサブクラス内でオーバーライドされます。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.これは購読リストではありません。 |
Java ソフトウェア |