Java AWT: マウスレス操作


最終更新: 1997 年 2 月 3 日

目的

今日の典型的な GUI はマウスで操作するように設計されていますが、GUI でのマウスレ ス操作が、使用性から重要になる (時には欠かせない) 多くの状況があります。これらの状況には次のようなものがあります:

AWT1.0 は、ネイティブピアコンポーネントがデフォルトで提供する (すなわち、タブ フォーカス横断、スペースバーアクティブ化など) 以外には、マウスレス操作を Java プログラムに構築する明示的な機能をなにも提供しません。 JDK1.1 について AWT は、この問題に対して 100 % の解決を決して提供できるわけではないとしても、Javaプログラムのマウスレスモードをよりよく有効化するためのベースラインサポートを追加します。 このサポートは後続のバージョンで拡張されます。 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. isTabbable() をオーバーライドして true を返す (Canvas はデフォルトで false を返す)
  2. コンポーネント上のマウスダウンイベントをキャッチし、requestFocus() を起動す る (コンポーネントに「タイプするためのクリック」を実装する)
  3. コンポーネントがフォーカスを得たとき、ビジュアルフィードバックを提供し、フォーカスを得たことを示す

コンポーネントが上記手順に従わない場合、ユーザがコンポーネントにフォーカスを与えることは困難になるかもしれません。

AWT は内部的にどのコンポーネントがフォーカスを持っているかを追跡し、Tab または Shift-Tab キーボードイベントに応じて、フォーカスをフォーワードにもバックワードにも移動できます。これは Windows に登録されている private 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);

修飾子

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

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

ほとんどのショートカット 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 (C) 1996, 1997 Sun Microsystems, Inc. All rights reserved.