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 に関しては、アクションリスナは直接メニュー項目自身に接続でき、この問題は緩和されます(詳細については、ドキュメントAWT Delegation イベントモデルを参照してください)。

サンプルコード

1.1 delegationイベントモデルを使用してこの 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 (C) 1996, Sun Microsystems, Inc. All rights reserved.