• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JPopupMenuをコンポーネントに追加
#navi(../)
*JPopupMenuをコンポーネントに追加 [#nc8dcfd3]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2008-03-10~
更新日:&lastmod;

#contents

**概要 [#d2623802]
JPopupMenuをコンポーネントに追加します。

#screenshot

**サンプルコード [#s7d9a0a6]
#code{{
JTextArea textArea = new JTextArea("ComponentPopupMenu Test");
textArea.setComponentPopupMenu(new TextComponentPopupMenu(textArea));
}}
#code{{
class TextComponentPopupMenu extends JPopupMenu {
  private final Action cutAction = new DefaultEditorKit.CutAction();
  private final Action copyAction = new DefaultEditorKit.CopyAction();
  private final Action pasteAction = new DefaultEditorKit.PasteAction();
  private final Action deleteAction;
  private final Action selectAllAction;
  public TextComponentPopupMenu(final JTextComponent textArea) {
    super();
    add(cutAction);
    add(copyAction);
    add(pasteAction);
    addSeparator();
    add(deleteAction = new AbstractAction("delete") {
      public void actionPerformed(ActionEvent evt) {
        textArea.replaceSelection(null);
      }
    });
    addSeparator();
    add(selectAllAction = new AbstractAction("select all") {
      public void actionPerformed(ActionEvent evt) {
        textArea.selectAll();
      }
    });
  }
  public void show(Component c, int x, int y) {
    JTextComponent textArea = (JTextComponent)c;
    boolean flg = textArea.getSelectedText()!=null;
    cutAction.setEnabled(flg);
    copyAction.setEnabled(flg);
    deleteAction.setEnabled(flg);
    super.show(c, x, y);
  }
}
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#c9617b81]
上記のサンプルでは、JTextAreaにsetComponentPopupMenu(JPopupMenu)メソッドで、ポップアップメニューを追加しています。

JDK1.5でこのメソッドが追加されたため、各コンポーネントにマウスリスナーを設定して、e.isPopupTrigger()でポップアップを表示するクリックかを判断するといったコードを書く必要が無くなっています。

ポップアップメニューを表示するときに、コンポーネントの状態(例えばJTableやJListなどでの行選択の有無や、テキストが選択されてるかとどうかなどの条件)で、
メニューが実行可か不可かを変更したい場合は、JPopupMenu#show(Component, int, int) メソッドをオーバーライドして使用します。

このサンプルでは、テキストが選択されている場合だけ、カット、コピー、削除メニューが有効になるよう設定しています。

//**参考リンク
**コメント [#ob667bd4]
#comment