DefaultEditorKitでポップアップメニューからコピー

編集者:Terai Atsuhiro~

作成日:2005-07-25
更新日:2024-01-11 (木) 12:39:26
  • category: swing folder: DefaultEditorKit title: DefaultEditorKitでポップアップメニューからコピー tags: [DefaultEditorKit, JTextField, JTextComponent, JPopupMenu] author: aterai pubdate: 2005-07-25T08:41:31+09:00 description: DefaultEditorKitを使って、JTextFieldなどでポップアップメニューを使ったコピー、貼り付け、切り取りを行います。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTKk8KGiNI/AAAAAAAAAWM/dJouzZuxv6g/s800/DefaultEditorKit.png

概要

DefaultEditorKitを使って、JTextFieldなどでポップアップメニューを使ったコピー、貼り付け、切り取りを行います。

概要

DefaultEditorKitを使って、JTextFieldなどでポップアップメニューを使ったコピー、貼り付け、切り取りを行います。

サンプルコード

#spanend
#spanadd
// textField.setComponentPopupMenu(new TextFieldPopupMenu());
#spanend
#spanadd
class TextFieldPopupMenu extends JPopupMenu {
#spanend
  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 = new AbstractAction("delete") {
    @Override public void actionPerformed(ActionEvent e) {
      Component c = getInvoker();
      if (c instanceof JTextComponent) {
        ((JTextComponent) c).replaceSelection(null);
      }
    }
  };
  private final Action cut2Action = new AbstractAction("cut2") {
    @Override public void actionPerformed(ActionEvent e) {
      Component c = getInvoker();
      if (c instanceof JTextComponent) {
        ((JTextComponent) c).cut();
      }
    }
  };

#spandel
#screenshot
#spanend
  protected TextFieldPopupMenu() {
    super();
    add(cutAction);
    add(copyAction);
    add(pasteAction);
    add(deleteAction);
    addSeparator();
    add(cut2Action);
  }

#spandel
**サンプルコード [#mcf85a7d]
#spanend
 private void showPop(final JTextField field, final MouseEvent me) {
   JPopupMenu pop = new JPopupMenu();
   boolean isSelected = (field.getSelectedText()==null)?false:true;
   Action action = new DefaultEditorKit.CutAction();
   action.putValue(Action.NAME, "切り取り");
   action.setEnabled(isSelected);
   pop.add(action);
   action = new DefaultEditorKit.CopyAction();
   action.putValue(Action.NAME, "コピー");
   action.setEnabled(isSelected);
   pop.add(action);
   action = new DefaultEditorKit.PasteAction();
   action.putValue(Action.NAME, "貼り付け");
   pop.add(action);
   action = new AbstractAction("削除") {
     public void actionPerformed(ActionEvent ae) {
       field.replaceSelection(null);
     }
   };
   action.setEnabled(isSelected);
   pop.add(action);
   pop.addSeparator();
   action = new AbstractAction("切り取り2") {
     public void actionPerformed(ActionEvent ae) {
       field.cut();
     }
   };
   action.setEnabled(isSelected);
   pop.add(action);
   pop.show(field, me.getX(), me.getY());
 }
  @Override public void show(Component c, int x, int y) {
    if (c instanceof JTextComponent) {
      JTextComponent tc = (JTextComponent) c;
      boolean f =  tc.getSelectionStart() != tc.getSelectionEnd();
      cutAction.setEnabled(f);
      copyAction.setEnabled(f);
      deleteAction.setEnabled(f);
      cut2Action.setEnabled(f);
      super.show(c, x, y);
    }
  }
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlin
  • &jnlp;
  • &jar;
  • &zip;

解説

  • DefaultEditorKit.CopyActionをポップアップメニューに追加してクリップボードを使ったコピーなどが可能になるよう設定
    • サンプルのcut2のように、JTextComponent#cut()メソッドなどを使用する方法もある

解説

DefaultEditorKitには、エディタとして必要な最小限度の機能をデフォルトで実装されています。上記のサンプルでは、DefaultEditorKit.CopyActionで、システムクリップボードを使ったコピーをポップアップメニューで行っています。
  • -
サンプルの"切り取り2"のように、JTextComponent#cut()などを使っても同様のことが行えます。
DefaultEditorKit1.png
サンプルをJavaWebStartで起動した場合は、システムクリップボードにアクセスせずにアプリケーション内部のみでのコピー、貼り付けとなるようです*1Java(TM) Web Start テクノロジ開発者ガイドの"ClipboardService サービスの使用"などを参照してみてください。

参考リンク

#screenshot(,screenshot2.png)

コメント