Duke logo doing a cartwheel Java AWT:ポップアップメニュー


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

目的

現在、ポップアップメニュー (「コンテキストメニュー」とも呼ばれる) は、最近の GUI (Win95、CDE など) では非常に一般的な UI 要素です。1.0 の AWT はプルダウンメニュー (メニューバーまたはメニュー項目に常に接続されるメニュー) しかサポートしておらず、Java プログラムが簡単にポップアップメニューを作成できる API を必要としています。

ポップアップメニュー API

この API の主要な目標は、ポップアップの作成と起動を、Java プログラムで簡単にできるようにすることです。さらに、ポップアップが単一のコンポーネントに強く結び付けられないこと、そして包含階層の内外両方で簡単に再使用できることを保証したいと考えています。

この API は Menu の新しいサブクラスから構成されます。

	java.awt.PopupMenu

このサブクラスに主に追加されたものは、次のポップアップを起動するメソッドです。

	public void show(Component origin, int x, int y)

このメソッドはコンポーネントパラメータで与えられるコンポーネントに対して相対的に x、y 座標の位置にポップアップを起動します (これは、すべてのパラメータが、与えられたマウスダウンイベントオブジェクトから簡単に抽出できるようにすることを意味する)。

ポップアップメニューの所有権

ポップアップメニューが表示されるためには有効な「親」コンポーネントが必要です。これは、表示前にポップアップメニューのインスタンスを生成し、キャッシュすることが可能であることを保証するためです (表示操作中に起り得る遅れを回避する。 ユーザの観点から見ると、表示操作はポップアップメニューを起動したマウスイベントと同時に発生するはずである)。ポップアップメニューは、 java.awt.Component クラスの新しいメソッドを使用して、すべてのコンポーネントに対して登録および削除することができます。
	add(PopupMenu popup)
	remove(MenuComponent popup)

ポップアップメニューを所有できるのは、1 つのコンポーネントからだけです。

show() メソッドに渡された「元の」パラメータは、ポップアップの親をルートとして定義された包含階層内に含まれるどのコンポーネントにもなれます (それ自身が親である必要はない)。これは、単一のポップアップをウィンドウ全体に定義する必要がある場合に特に有効です。 ポップアップメニューはフレームに追加しますが、そのフレーム内のすべてのコンポーネントのマウスダウンイベントに応じて、ポップアップメニューを起動できます。

ポップアップイベントのトリガ

ポップアップメニューの重要な課題は、適切なイベントトリガを定義することです。 適切なイベントトリガは、プラットフォームによってわずかに異なるためです。

この API はプラットフォームから独立した抽象概念を提供し、ハードコーディングのプラットフォーム固有イベント処理ロジックを内部に持たずに、プログラムはポップアップメニュートリガイベントを検出できます。これは、java.awt.event.MouseEvent 上の次のメソッドを提供することで達成されます。

	public boolean isPopupTrigger()

イベントモデルの問題

AWT の 1.0 イベントモデルでは、メニューイベント (メニュー項目が選択されたときに起動されるアクション) はメニュー自身内でキャッシュできないため、親のフレームでキャッチしなければならないという制限があります。1.0 イベントモデルで作業するためには、ポップアップメニューイベントは、それを所有するコンポーネントの action() メソッドでキャッチする必要があります。ポップアップメニューは特定のコンポーネントに強く結び付けるように設計されていないため、ポップアップメニューにとってこれは望ましくない制限です。新しい 1.1 イベントモデル API に関しては、アクションリスナーは直接メニュー項目自身に接続できるため、この問題は緩和されます。 詳細については、ドキュメント「委譲イベントモデル」を参照してください。

サンプルコード

1.1 委譲イベントモデルを使用してこの API の使用法を表す、簡単なサンプルプログラムを次に示します。
    
    import java.awt.*;
    import java.applet.*;
    import java.awt.event.*;

    public class PopupMenuTest extends Applet implements ActionListener {

	PopupMenu popup;

	public void init() {	    
            MenuItem mi;

	    popup = new PopupMenu("Edit");

            mi = new MenuItem("Cut");
            mi.addActionListener(this);
	    popup.add(mi);

            mi = new MenuItem("Copy");
            mi.addActionListener(this);
	    popup.add(mi);

	    popup.addSeparator();

            mi = new MenuItem("Paste");
            mi.addActionListener(this);
	    popup.add(mi);

	    add(popup); // add popup menu to applet
           
            enableEvents(AWTEvent.MOUSE_EVENT_MASK); 

	    resize(200, 200);
        }

	public void processMouseEvent(MouseEvent e) {

	    if (e.isPopupTrigger()) { 
	        popup.show(e.getComponent(), e.getX(), e.getY());
	    }
	    super.processMouseEvent(e);
        }

        public void actionPerformed(ActionEvent e) {
	    String command = e.getActionCommand();

            if (command.equals("Cut")) {
	        // perform cut operation
            } else if (command.equals("Copy")) {
                // perform copy operation
            } else if (command.equals("Paste")) {
                // perform paste operation
            }
        }
    }
	



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