java.awt.PopupMenu

目的
アプリケーションに、ポップアップメニューを実装する。

関連クラス

今回のソース
import java.awt.*;
import java.awt.event.*;

class PopupMenuDemo
{
	public static void main(String args[])
	{
		new MainWindow();
	}
}

class MainWindow extends Frame
{
	PopupMenu p_menu;

	// ポップアップメニュー用のラベル
	final String LARGE = "Larger";
	final String SMALL = "Smaller";
	final String EXIT = "Exit";

	// 独自メッセージ
	final int WINDOW_LARGE = 2000;
	final int WINDOW_SMALL = 2001;

	// サイズの定義
	final Dimension LARGER_SIZE = new Dimension(500,500);
	final Dimension SMALLER_SIZE = new Dimension(100,100);

	// コンストラクタ
	public MainWindow()
	{
		super("Popup Menu Test");
		setSize(255,255);

		// ウインドウイベント処理を可能にする
		enableEvents(AWTEvent.WINDOW_EVENT_MASK);

		// ポップアップメニューの構築
		p_menu = new PopupMenu();
		MenuItem item = new MenuItem(LARGE);
		item.setActionCommand(LARGE);
		p_menu.add(item);

		item = new MenuItem(SMALL);
		item.setActionCommand(SMALL);
		p_menu.add(item);

		p_menu.addSeparator();

		item = new MenuItem(EXIT);
		item.setActionCommand(EXIT);
		p_menu.add(item);

		// ポップアップメニューのアクションリスナの定義
		ActionListener action_listener = new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				String command = e.getActionCommand();
				if(command == LARGE)
				{
					dispatchEvent(new WindowEvent(MainWindow.this,WINDOW_LARGE));
				}
				else if(command == SMALL)
				{
					dispatchEvent(new WindowEvent(MainWindow.this,WINDOW_SMALL));
				}
				else if(command == EXIT)
				{
					System.exit(0);
				}
			}
		};
		p_menu.addActionListener(action_listener);

		// マウスリスナの定義
		MouseListener mouse_listener = new MouseAdapter()
		{
			public void mousePressed(MouseEvent e)
			{
				// 右ボタンが押された時、ポップアップメニューを表示する
				if(e.getModifiers() == InputEvent.BUTTON3_MASK)
					p_menu.show(MainWindow.this,e.getX(),e.getY());
			}
		};
		addMouseListener(mouse_listener);

		add(p_menu);
		setVisible(true);
	}

	// ウインドウイベントの処理
	protected void processWindowEvent(WindowEvent e)
	{
		if(e.getID() == WINDOW_LARGE)
		{
			this.setSize(LARGER_SIZE);
		}
		else if(e.getID() == WINDOW_SMALL)
		{
			this.setSize(SMALLER_SIZE);
		}
		else if(e.getID() == WindowEvent.WINDOW_CLOSING)
		{
			System.exit(0);
		}
	}
}
Source is here. (ZIP Format,1085Byte,Shift-JIS)

コンパイル&実行
javac PopupMenuDemo.java
java PopupMenuDemo

説明
(概略)

JDK1.1から追加された、ポップアップメニューを扱ってみました。
Windowsでは、右クリックで出てくるアレです。
かなり実用性は高く、しかも簡単に出来るので、
機会があれば、使ってみてはいかがでしょうか。

(サンプルプログラムの説明)

enableEvents(AWTEvent.WINDOW_EVENT_MASK);
今までのイベント処理は、イベント処理対象に、
リスナオブジェクトを実装することで行ってきましたが、
その方法では、WindowEventクラスで定義されているイベントしか処理できません。
そこで、もう一つの方法として、processWindowEvent(WindowEvent)
を使う方法があります。
この方法では、getID()メソッドで、イベントのタイプ(メッセージ)
を判別し、イベント処理を行います。
これを使うには、イベント処理を有効にしなければならないので、
このような、メソッド呼び出しを行っています。
item.setActionCommand(LARGE);
このメソッドは、各メニューアイテムに、ラベルを設定しています。
イベント処理の際に、どのメニューが選択されたかを判別する時に、
getActionCommand()で、ラベルを得て、比較することが出来ます。
dispatchEvent(new WindowEvent(MainWindow.this,WINDOW_LARGE));
イベントを送る際に使います。
この場合は、WINDOW_LARGEという、独自のメッセージを元に、
WindowEventを構築し、フレームに対して送っています。
もちろん、独自メッセージだけでなく、WindowEvent.WINDOW_CLOSINGなどの、
既存のメッセージも送ることが出来ます。
add(p_menu);
コンポーネントはaddするのが普通ですが、
私、PopupMenuクラスは、Windowクラスのサブクラスだと勘違いしていて、
構築して、showすれば表示出来るものだと思ってました(^^;
実際は、Menuクラスのサブクラスなので、なんら関係無かったです。
というわけで、MainWindowへのaddは必要です。