Java AWT: マウスレス操作
最終更新: 1997 年 2 月 3 日
目的
今日の典型的な GUI はマウスで操作するように設計されていますが、GUI でのマウスレ
ス操作が、使用性から重要になる (時には欠かせない) 多くの状況があります。これらの状況には次のようなものがあります:
AWT1.0 は、ネイティブピアコンポーネントがデフォルトで提供する (すなわち、タブ フォーカス横断、スペースバーアクティブ化など) 以外には、マウスレス操作を Java プログラムに構築する明示的な機能をなにも提供しません。 JDK1.1 について AWT は、この問題に対して 100 % の解決を決して提供できるわけではないとしても、Javaプログラムのマウスレスモードをよりよく有効化するためのベースラインサポートを追加します。 このサポートは後続のバージョンで拡張されます。 1.1 にある 2 つの機能は次のとおりです:
このようにフォーカスを受け取ることができるコンポーネントは、フォーカスを取得 したとき常にある形式のビジュアルフィードバックをレンダする必要があります。そうすれば、ユーザは Tab/Shift-Tab を使用しながら横断するとき、簡単にどのコンポーネントがフォーカスを持っているかが分かります。通常このフィードバックは、コンポーネントの周囲の色の付いた境界の箱の形を取ります。
各プラットフォームのネイティブツールキットは、デフォルトでフォーカス横断のサ
ポートを、程度の違いはあれ提供します。しかし、この明示的なサポートは一般的な Java AWT コードで実装され、動作がプラットフォームをまたがってより一貫性のあるものになっています。
フォーカス横断 API
この API は極めて単純です; これは java.awt.Component および java.awt.peer.ComponentPeer 上の新しいメソッドから構成されます:
public boolean isFocusTraversable()
このメソッドは、コンポーネントがキーボードフォーカスを継承的に受け取ることができる型である場合は true を返し、そうでなければ falseを返します。
このメソッドがピアクラスのために存在する理由は、 AWT コンポーネントが作成するネイティブピアコンポーネントが、異なるプラットフォーム上で異なる横断規則を持っているからです。これによって、この属性を各プラットフォーム上で仕立て上げることができます (例えば、Mac 上では、Button はフォーカスを取得できませんが、Motifおよび Win32 上では可能です)。
既存のすべての AWTコンポーネントは、デフォルトでこの属性を適当にセットしておく必要がありますが、コンポーネントをサブクラス化してこのメソッドをオーバーライドし、プログラムに対して適当な値を返すオプションがあります。とりわけ、 java.awt.Canvas をサブクラス化してキーボードフォーカスを取得するよう設計された自分自身のカスタムコンポーネントを構築しようとする場合、次の 3 つのことを実行する必要があります:
コンポーネントが上記手順に従わない場合、ユーザがコンポーネントにフォーカスを与えることは困難になるかもしれません。
AWT は内部的にどのコンポーネントがフォーカスを持っているかを追跡し、Tab または Shift-Tab キーボードイベントに応じて、フォーカスをフォーワードにもバックワードにも移動できます。これは Windows に登録されている private FocusManager オブジェクトによって処理されます。FocusManager はウィンドウの Container がどれだけ深くネストしていても、フォーカスの移行を正しく管理できます。この横断の順番はコンテナに含まれるコンポーネントに等しくなります; デフォルトでは、これは子が Container に追加された順番に等しくなりますが、 Container の add(Component c, int pos) メソッドを使用してこの順番を制御できます。FocusManager は、フォーカスを割り当てる前に "focusTraversable" コンポーネントが可視であり、かつアクティブであるかどうかを自動的にチェックします (今後、isFocusTraversable() メソッドはこの状態を返された値に対して考慮する必要がありません)。
注: 横断の順番を構成するもっと柔軟な機構が必要であることが認識されており、現在この問題の解決に取り組んでいるところです。
ショートカットはメニューコマンドのキーボード相当として定義され、適当なキーの組み合わせで、メニュー項目が選択されたかのように同じアクションを開始することができます。ショートカットはまたキーボード相当またはアクセラレータとして知られています。
ショートカット API
API は次のクラスから構成されます:
java.awt.MenuShortcut
java.awt.MenuItem には次の追加メソッドがあります:
public MenuItem(String label, MenuShortcut s)
public MenuShortcut getShortcut()
public void setShortcut(MenuShortcut s)
public void deleteShortcut();
java.awt.MenuBar には次の追加メソッドがあります:
public MenuItem getShortcutMenuItem(MenuShortcut s);
public Enumeration shortcuts();
boolean handleShortcut(KeyEvent e);
public void deleteShortcut(MenuShortcut s);
注: ALT の、 AWT が既に割り当てた QUIT 以外のアプリケーションショートカットへの使用は、想定されていません。
ほとんどのショートカット API は共有コードで実装されますが、1 つのメソッドは java.awt.Toolkit に追加され、プラットフォーム毎に適当な修飾子を返します:
public int getMenuShortcutKeyMask();
menu.add(new MenuItem("Save..."));
menu.add(new MenuItem("Send..."));
1.1 でショートカット付メニュー項目を作成するコード:
// Specify an 's' shortcut for save, and 'shift-s' for send.
menu.add(new MenuItem("Save...", new MenuShortcut('s'));
menu.add(new MenuItem("Send...", new MenuShortcut('s', true));