Java AWT:マウスレス操作


最終更新日: 1997 年 2 月 3 日

目的

現在の典型的な GUI はマウスで操作するように設計されていますが、GUI でのマウスレス操作が、可用性のために重要になる (時には欠かせない) 状況が数多くあります。これには以下のような状況があります。

AWT 1.0 は、ネイティブピアコンポーネントがデフォルトで提供する (タブフォーカストラバーサル、スペースバーアクティブ化など) 以外のマウスレス操作を Java プログラムに構築する明示的な機能を提供しません。JDK 1.1 について AWT は、この問題に対して 100 % の解決を提供できるわけではないとしても、Java プログラムのマウスレスモードをさらに有効化するための基準線となるサポートを追加します。このサポートは後続のバージョンで拡張されます。JavaTM プラットフォームのバージョン 1.1 から、次の 2 つの機能が導入されました。


フォーカストラバーサル

フォーカストラバーサルは、キーストローク (マウスでなく) を使用し、キーボードフォーカスを受け入れることができるコンポーネント間を横断する能力であると定義されます。これらのキーストロークは、前に移動するためには <Tab>、後ろへ移動するためには <Shift-Tab> と定義されます。一度コンポーネントがフォーカスを所有すると、そのコンポーネントをさらに追加定義したキーストロークで、アクティブ化/操縦することができるはずです (Button を押すための <space> など)。一度フォーカスを取得すると、適切なアクティブ化を実装するのは、(AWT ではなく) コンポーネントの責任となります。

このようにフォーカスを受け取ることができるコンポーネントは、フォーカスを取得したとき常に、ある形式でビジュアルフィードバックをレンダリングする必要があります。そうすれば、ユーザは 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 つのことを実行する必要があります。

  1. isFocusTraversable() をオーバーライドして true を返す (Canvas はデフォルトで false を返す)
  2. コンポーネント上のマウスダウンイベントをキャッチし、requestFocus() を起動する (コンポーネントに「入力するためのクリック」を実装する)
  3. コンポーネントがフォーカスを得たとき、ビジュアルフィードバックを提供し、フォーカスを得たことを示す

コンポーネントが上記の手順に従わない場合、ユーザがコンポーネントにフォーカスを与えることが困難になる可能性があります。

AWT は内部的にどのコンポーネントがフォーカスを持っているかを追跡し、Tab または Shift-Tab キーボードイベントに応じて、フォーカスを前方にも後方にも移動できます。これはウィンドウに登録されている私有の FocusManager オブジェクトによって処理されます。FocusManager はウィンドウの Container がどれだけ深くネストしていても、フォーカスの移行を正しく管理できます。このトラバーサルの順番はコンテナに含まれるコンポーネントに等しくなります。デフォルトでは、これは子が Container に追加された順番に等しくなりますが、Container の add(Component c, int pos) メソッドを使用してこの順番を制御できます。FocusManager は、フォーカスを割り当てる前に focusTraversable コンポーネントが可視であり、かつアクティブであるかどうかを自動的にチェックします。今後、isFocusTraversable() メソッドはこの状態を返された値に対して考慮する必要がありません。

注:トラバーサルの順番を構成するための柔軟な機構が必要であると考えられており、現在この問題の解決に取り組んでいます。


メニューショートカット

AWT ショートカット API の目標は、アプリケーション開発者がショートカットをメニューナビゲーションの補助として簡単に提供できるようにすることです。この API は、メニューショートカットだけに取り組み、他のマウスレスメニューナビゲーションの問題には触れません。

ショートカットはメニューコマンドのキーボード相当として定義され、適当なキーの組み合わせで、メニュー項目が選択されたかのように同じアクションを開始することができます。ショートカットはまたキーボード等価キーまたはアクセラレータとも呼ばれます。

ショートカット 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);

修飾子

アプリケーションショートカットにはすべて、プラットフォームごとに共通のキー修飾子があります。

注:AWT がすでに割り当てた QUIT 以外のアプリケーションショートカットでの ALT の使用は、想定されていません。

ほとんどのショートカット API は共有コードで実装されますが、1 つのメソッドは java.awt.Toolkit に追加され、プラットフォームごとに適当な修飾子を返します。

	    public int getMenuShortcutKeyMask();

ビジュアル指示

ユーザがメニューショートカットについて学び使用するためには、メニュー項目がサポートするショートカットのビジュアル指示を表示することが重要です。これについては、与えられたプラットフォームにもっとも適した方法で、AWT が自動的に処理します。

サンプルコード

1.0 でメニュー項目を作成するコード:
	    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));



コメントの送付先: java-awt@java.sun.com
Copyright © 1996, 1997 Sun Microsystems, Inc. All rights reserved.