右クリックでポップアップメニューを表示するJavaTips 〜Javaプログラミング編

» 2005年04月13日 10時00分 公開
[小田原大@IT]

 コンポーネント上を右クリックしてポップアップメニューを表示させることが、GUIプログラミングにおいてよく行われます。本TIPSでは、(1)クリック時にマウスボタンを区別し、それによって(2)ポップアップメニューを表示させる方法を紹介します。

マウスボタンの区別

 GUIコンポーネントをクリックしたときの処理は、コンポーネントに登録したマウスリスナの各種メソッド(mouseClicked、 mousePressed など)を実装することで可能ですが、マウスイベントはマウスのどのボタンがクリックされたのかを区別しません。

 これを調べるためには、javax.swing.SwingUtilitiesのクラスメソッドisRightMouseButtonを用います。ほかのボタンを判別するためのメソッドもそれぞれ用意されています。実装は以下に示すように非常に簡単です。

is{Right,Middle,Left}MouseButtonの利用
public void mouseClicked(mouseEvent e){
  if(javax.swing.SwingUtilities.isRightMouseButton(e)){
    // 右クリック時の処理
  } else if(javax.swing.SwingUtilities.isMiddleMouseButton(e)){
    // 中ボタンクリック時の処理
  } else if(javax.swing.SwingUtilities.isLeftMouseButton(e)){
    // 左クリック時の処理
  }
}


 MouseEvent型のオブジェクトを引数にとれるところなら、どこでも呼び出せます。

ポップアップメニューの表示

 ポップアップメニューの表示はjavax.swing.JPopupMenuによって行われます。1つ以上のメニュー項目を持ち、そのうち1つを選択したらイベント(ActionEvent)が発生します。オブジェクトの生成から表示までの流れは、以下のようになります。

  1. JPopupMenuのオブジェクトpopupを生成
  2. メニューの項目(JMenuItem item)を生成
  3. itemにリスナ(ActionListener)を登録
  4. popupにitemを追加
  5. popupを表示
MyPanel.java(ポップアップメニューの生成・表示)
import java.awt.event.*;
import javax.swing.*;
public class MyPanel extends JPanel implements MouseListener{
  JPopupMenu popup = new JPopupMenu(); // ポップアップメニューを生成
  public MyPanel(){
    addMouseListener(this); // マウスリスナを登録
    addPopupMenuItem(“Menu1”, new ActionListener(){ //無名クラスをアクションリスナとして定義しaddPopupMenuItemの引数に与える
         public void actionPerformed(ActionEvent e){
           // “Menu1”が選択されたときの処理を定義
           System.out.println(“Menu1 selected.”);
         }
       });
  }
  // メニュー項目を追加
  private JMenuItem addPopupMenuItem(String name, ActionListener al){
    JMenuItem item = new JMenuItem(name);
    item.addActionListener(al);
    popup.add(item);
    return item;
  }
  // マウスリスナのメソッドを定義
  public void mouseClicked(MouseEvent e){
    if(SwingUtilities.isRightMouseButton(e)){
      popup.show(e.getComponent(), e.getX(), e.getY());
    }
  }
  // MouseListenerに宣言されている各種メソッドを定義(ここでは省略)
}


 上記のMyPanel.javaは、SwingのJPanelを継承しパネルのクラスを定義しています。フィールドにJPopupMenuのインスタンスpopupを持っており、MyPanelのオブジェクトの生成時にこれにメニューを追加しています。

 ここでは、addPopupMenuというメソッドの中で、前述の「2.メニューの項目(JMenuItem item)を生成」、「3.itemにリスナ(ActionListener)を登録」、「4.popupにitemを追加」 を一括して行っています。

 リスナの実装時に、actionPerformedメソッドの中でメニューに対応した処理を定義します。ここでは、「Menu1」という名前のメニューを選択したら、ターミナルに、

Menu1 selected.


と表示されます。

 popupの表示については、JPopupMenuのshowメソッドを用います。最初の引数(e.getComponent())でポップアップメニューがその上に表示されるべきコンポーネントを指定し、その次に表示位置を指定しています。ここではクリックした位置を表示位置としています。

 また、マウスリスナも定義・登録しなければなりません。MyPanelに、javax.swing.event.MouseListenerを実装させ、mouseClickedのみ実装しています(ほかのMouseListenerに宣言されたメソッドも実装する必要がありますが、ここでは省略しています)。最初に触れたSwingUtilities.isRightMouseButtonを用いて、右クリックであるかどうかを判別し、そうであればpopup.showを呼び出しています。

 下記の実行クラス「MyFrame.java」は、上記のコードを実行するためのクラスです。

MyFrame.java
import javax.swing.*;
public class MyFrame extends JFrame{
  public MyFrame(String name){
    super(name);
  }
  public static void main(String[] args){
    MyFrame frame = new MyFrame(“MyFrame”);
    MyPanel panel = new MyPanel();
    frame.getContentPane().add(panel);
    frame.setSize(200, 100);
    frame.show();
  }
}


 MyFrame.javaとMyPanel.javaを作成し、コンパイルしてからMyFrameクラスを実行すると下図のような結果が得られます。

画面1画面2 MyFrameと、その上のMyPanelを右クリックして表示されたポップアップメニュー

Profile

WINGSプロジェクト

小田原大


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。