ポップアップメニュー
ポップアップとコンポーネント
ポップアップメニューとは、たとえばWindowsプラットフォームで
Microsoft Internet Ecplorerを使ってこの画面を見ているのならば
右クリックした時に出てくるメニューウィンドウのことです
AWTは、コンポーネント上の指定位置にメニューを表示するポップアップをサポートしています
ポップアップメニューを生成するにはjava.awt.PopupMenuクラスを使用します
このクラスはMenuクラスを拡張しているクラスです。メニュー項目の登録方法は同じです
コンストラクタは次のものが用意されています
public PopupMenu()
public PopupMenu( String title )
titleには、ポップアップメニューのタイトル(名前)を指定することができます
Popupメニューをコンポーネントに表示するにはshow()メソッドを使います
このメソッドは、指定されたコンポーネントの指定位置にポップアップメニューを表示します
public void show( Component origin, int x, int y )
originには、ポップアップオブジェクトを表示するコンポーネントを指定します
xとyにはコンポーネント上のx座標とy座標を指定し
ここで指定されたポイントがポップアップメニューの左上部として、ポップアップが表示されます
しかし、これだけではポップアップは表示されません
コンポーネントに表示するにはポップアップメニューをコンポーネントに登録しなければなりません
ポップアップメニューをコンポーネントに登録するにはComponentクラスのadd()メソッドを使用します
public synchronized void add( PopupMenu popup )
popupには、コンポーネントに登録するポップアップメニューを指定します
これで、何らかのイベントでポップアップメニューを指定位置に表示させることが可能です
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
/* <applet code="App58.class" width="300"height="300">
</applet>
*/
public class App58 extends Applet implements MouseListener {
PopupMenu pop = new PopupMenu("Kitty");
public void init() {
setBackground(Color.white);
for (int i = 0 ; i < 5 ; i++) pop.add(new MenuItem("Kitty on your lap"));
add(pop);
addMouseListener(this);
}
public void mousePressed(MouseEvent e) {
pop.show(this , e.getX() , e.getY());
}
public void mouseClicked(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
}
コンポーネントの上をクリックしてみてください
ポップアップメニューが表示されます
しかし、この時点でも問題があります
Javaプラットフォームは、全てのプラットフォームで互換性を取るため
マウスイベントでポップアップを表示するなどでは、プラットフォーム固有のポップアップイベントが表現できません
ポップアップイベントは、プラットフォームで異なり
Windowsプラットフォームでは、マウスボタン2(右ボタン)を押して放す(クリック)すると表示されますが
Motifでは多少動作が異なり、ボタンを押続けるか短時間でボタンを離すことで表示されるそうです
そこで、MouseEventクラスではポップアップイベントかどうかを評価するメソッドが用意されています
マウスイベントがそのプラットフォームのポップアップメニューの
起動イベントであるかどうかを調べるにはisPopupTrigger()メソッドを使用します
public boolean isPopupTrigger()
ポップアップメニュー起動イベントの場合はtrueを返します
これを有効に動作させるにはクリック動作のリスナーメソッド全てでチェックします
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
/* <applet code="App59.class" width="300"height="300">
</applet>
*/
public class App59 extends Applet implements MouseListener {
PopupMenu pop = new PopupMenu("Kitty");
public void init() {
setBackground(Color.white);
for (int i = 0 ; i < 5 ; i++) pop.add(new MenuItem("Kitty on your lap"));
add(pop);
addMouseListener(this);
}
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) pop.show(this , e.getX() , e.getY());
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) pop.show(this , e.getX() , e.getY());
}
public void mouseClicked(MouseEvent e) {
if (e.isPopupTrigger()) pop.show(this , e.getX() , e.getY());
}
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
}
ポップアップ起動の動作がプラットフォームで異なるため
全てのプラットフォーム互換でポップアップメニュー起動イベントの通知を受けるには
一般的にこのようにプログラムします
mousePressed() , mouseReleased() , mouseClicked()のイベント通知に
それぞれ、MouseEvent.isPopupTrigger()でチェックさせています
そのため、先程のプログラムとは異なり
アプレットを起動しているプラットフォームのポップアップメニュー起動イベントで表示されます
Windowsプラットフォームであれば、右クリックすることでポップアップメニュが−表示されます