ポップアップ
ポップアップの表示
Swing のポップアップメニューは javax.swing.JPopupMenu クラスが実装します
基本的には JMenu のように扱うことができ、JMenuItem を追加できます
しかし、このクラスは JMenu との関連はなく JComponent を継承しています
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
|
+--javax.swing.JPopupMenu
public class JPopupMenu extends JComponent
implements Accessible, MenuElement
このクラスのコンストラクタは次のようになっています
public JPopupMenu()
public JPopupMenu(String label)
label には、このポップアップメニューのタイトルを指定します
ただし、この情報がどのように使われるかは UI に依存します
ポップアップメニューに項目を追加するには JPopupMenu.add() メソッドを使います
public JMenuItem add(Action a)
public JMenuItem add(String s)
public JMenuItem add(JMenuItem menuItem)
a にはアクションを、s には項目のテキストを
menuItem には項目となる JMenuItem を指定します
メソッドは、追加された JMenuItem を返します
また、コンポーネントをポップアップメニューとして追加したい場合は
add() メソッドではなく JMenuItem.insert() メソッドで設定します
public void insert(Action a , int index)
public void insert(Component component , int index)
a は挿入するアクション、index は 0 を先頭とした項目を挿入する位置を指定します
component には、挿入するコンポーネントを指定します
ポップアップメニューを表示するには JPopupMenu.show() を使います
public void show(Component invoker , int x , int y)
invoker にはポップアップメニューが表示されるコンポーネントを
x にはコンポーネントの相対的な x 座標、y には y 座標をそれぞれ指定します
ポップアップは、常に何らかのコンポーネントに関連付けられなければなりません
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class Test extends JApplet implements MouseListener {
JPopupMenu popup = new JPopupMenu();
public void init() {
popup.add("Sakura Kinomoto");
popup.add("Tomoyo Daidoji");
getContentPane().addMouseListener(this);
}
public void mousePressed(MouseEvent e) { showPopup(e); }
public void mouseReleased(MouseEvent e) { showPopup(e); }
public void mouseClicked(MouseEvent e) { showPopup(e); }
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
private void showPopup(MouseEvent e) {
Component com = (Component)e.getSource();
if (e.isPopupTrigger()) popup.show(com , e.getX() , e.getY());
}
}
このプログラムは、ポップアップトリガーを判定し
マウスイベントがポップアップトリガーであれば、メニュを表示します
しかし、Swing で実装されているポップアップにはある制限に遭遇します
それは、軽量コンポーネントは重量コンポーネントに隠れてしまうということと
重量フレームの外部に表示することができないというジレンマです
そこで、Swing の設計者は表示位置とポップアップのサイズで
軽量、重量、ウィンドウのポップアップを表示する方法を採用しました
表示位置がウィンドウ内部で、軽量コンポーネントの上であれば軽量を
重量コンポーネントの上ならば、AWT パネルを使った中間的なポップアップを
そして、フレームレベルであればウィンドウを作成してポップアップとするのです
これは、上の図を見てくれればその仕組みが理解できるでしょう
ポップアップがフレームの外に表示される場合、コンポーネントは重量です
その証拠に、アプレットが Java Window であることを表す警告を発生させています
しかし、内部に納まる場合は軽量コンポーネントなので、警告は表示されません