コンポーネント上を右クリックしてポップアップメニューを表示させることが、GUIプログラミングにおいてよく行われます。本TIPSでは、(1)クリック時にマウスボタンを区別し、それによって(2)ポップアップメニューを表示させる方法を紹介します。
GUIコンポーネントをクリックしたときの処理は、コンポーネントに登録したマウスリスナの各種メソッド(mouseClicked、 mousePressed など)を実装することで可能ですが、マウスイベントはマウスのどのボタンがクリックされたのかを区別しません。
これを調べるためには、javax.swing.SwingUtilitiesのクラスメソッドisRightMouseButtonを用います。ほかのボタンを判別するためのメソッドもそれぞれ用意されています。実装は以下に示すように非常に簡単です。
public void mouseClicked(mouseEvent e){ |
MouseEvent型のオブジェクトを引数にとれるところなら、どこでも呼び出せます。
ポップアップメニューの表示はjavax.swing.JPopupMenuによって行われます。1つ以上のメニュー項目を持ち、そのうち1つを選択したらイベント(ActionEvent)が発生します。オブジェクトの生成から表示までの流れは、以下のようになります。
import java.awt.event.*; |
上記の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」は、上記のコードを実行するためのクラスです。
import javax.swing.*; |
MyFrame.javaとMyPanel.javaを作成し、コンパイルしてからMyFrameクラスを実行すると下図のような結果が得られます。
Copyright © ITmedia, Inc. All Rights Reserved.