右クリックでポップアップメニューを表示するサンプルです。

ポイント

  1. ポップアップメニューは、JFrameの上に載せるコンポーネントに実装するのが一般的です。
  2. ポップアップメニューはJPopupMenuにJMenuItemを追加して作ります
  3. 右クリックを検知するにはaddMouseListenerでマウスリスナーを設定します
  4. マウスクリックイベントはmouseClickedに届きます
  5. マウスのどのボタンをクリックしてもmouseClickedに来るので、押されたボタンを判定します
  6. 右クリックの判定ならSwingUtilities.isRightMouseButtonが便利です
  7. e.getX() e.getY()を渡すと、ちょうどマウスでクリックしたところにメニューが出ます

実行結果

右クリックして~ メニューを選択、ダイアログが表示されました。

ソース PopupMenuTest.java

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
 
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
 
// ポップアップメニューのテスト
// ポイント1 ポップアップメニューは、JFrameの上に載せるコンポーネントに実装するのが一般的です。
// なので今回はJFrameではなくJPanelのサブクラスで作ります
public class PopupMenuTest extends JPanel implements ActionListener,
		MouseListener {
	// ポップアップメニューをクラス変数に持ちます
	JPopupMenu popupMenu = new JPopupMenu();
 
	public static void main(String[] args) {
		// JFrameを作り、基本的な設定をします
		JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setBounds(100, 100, 200, 100);
		f.setTitle("右クリックメニューのテスト");
 
		// コンテンツペインに今回作成したパネルを追加します。
		f.getContentPane().add(new PopupMenuTest());
		f.setVisible(true);
	}
 
	public PopupMenuTest() {
		init();
	}
 
	// 初期化メソッド
	private void init() {
		// ポイント2 ポップアップメニューはJPopupMenuにJMenuItemを追加して作ります
		// JMenuItemを作りJPopupMenuに追加します
		JMenuItem i = new JMenuItem("右クリックメニューのテストi");
		JMenuItem j = new JMenuItem("右クリックメニューのテストj");
		// どのメニューが押されたか判断するために名前をつけます
		i.setName("i");
		j.setName("j");
		// アクションリスナーを設定します
		i.addActionListener(this);
		j.addActionListener(this);
		// ここでポップアップメニューにアイテムを追加します
		popupMenu.add(i);
		popupMenu.add(j);
 
		// ポイント3 右クリックを検知するにはaddMouseListenerでマウスリスナーを設定します
		addMouseListener(this);
	}
 
	// ActionListenerの実装メソッドです
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() instanceof Component) {
			Component c = (Component) e.getSource();
			String name = c.getName();
			if ("i".equals(name)) {
				JOptionPane.showMessageDialog(this, "選択されたのはiメニューです。");
			}
			if ("j".equals(name)) {
				JOptionPane.showMessageDialog(this, "選択されたのはjメニューです。");
			}
		}
	}
 
	// MouseListenerインターフェイスの実装メソッドです
	// ポイント4 マウスクリックイベントはmouseClickedに届きます
	@Override
	public void mouseClicked(MouseEvent e) {
		// マウスクリックでここに来ます
		// ポイント5 マウスのどのボタンをクリックしてもmouseClickedに来るので、押されたボタンを判定します
		// ポイント6 右クリックの判定ならSwingUtilities.isRightMouseButtonが便利です
		if (SwingUtilities.isRightMouseButton(e)) {
			// ポップアップメニューを表示します。
			// ポイント7 e.getX() e.getY()を渡すと、ちょうどマウスでクリックしたところにメニューが出ます
			popupMenu.show(this, e.getX(), e.getY());
		}
	}
 
	@Override
	public void mousePressed(MouseEvent e) {
		// マウスのボタンを押した時はここに来ます
		// 今回は何もしないので空のメソッドにしておきます
	}
 
	@Override
	public void mouseReleased(MouseEvent e) {
		// マウスのボタンを離した時はここに来ます
		// 今回は何もしないので空のメソッドにしておきます
	}
 
	@Override
	public void mouseEntered(MouseEvent e) {
		// マウスカーソルがコンポーネントの上にきた時にここに来ます
		// 今回は何もしないので空のメソッドにしておきます
	}
 
	@Override
	public void mouseExited(MouseEvent e) {
		// マウスカーソルがコンポーネントの外にでた時にここに来ます
		// 今回は何もしないので空のメソッドにしておきます
	}
}
 

アフィリエイト

ここまで

最終更新:2012年09月22日 11:27