最終更新日: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 座標の位置にポップアップを起動します (これは、すべてのパラメータが、与えられたマウスダウンイベントオブジェクトから簡単に抽出できるようにすることを意味する)。
add(PopupMenu popup)
remove(MenuComponent popup)
ポップアップメニューを所有できるのは、1 つのコンポーネントからだけです。
show() メソッドに渡された「元の」パラメータは、ポップアップの親をルートとして定義された包含階層内に含まれるどのコンポーネントにもなれます (それ自身が親である必要はない)。これは、単一のポップアップをウィンドウ全体に定義する必要がある場合に特に有効です。 ポップアップメニューはフレームに追加しますが、そのフレーム内のすべてのコンポーネントのマウスダウンイベントに応じて、ポップアップメニューを起動できます。
ポップアップイベントのトリガ
ポップアップメニューの重要な課題は、適切なイベントトリガを定義することです。 適切なイベントトリガは、プラットフォームによってわずかに異なるためです。
この API はプラットフォームから独立した抽象概念を提供し、ハードコーディングのプラットフォーム固有イベント処理ロジックを内部に持たずに、プログラムはポップアップメニュートリガイベントを検出できます。これは、java.awt.event.MouseEvent 上の次のメソッドを提供することで達成されます。
public boolean isPopupTrigger()
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
}
}
}