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()
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
}
}
}