概要

JTextArea内の文字列がマウス操作で選択された場合のイベントを取得するMouseListenerCaretListenerを設定し、その選択文字列を自動的にクリップボードにコピーする機能を追加します。

サンプルコード

class CopyOnSelectListener extends MouseAdapter implements CaretListener, KeyListener {
  private boolean dragActive;
  private boolean shiftActive;
  private int dot;
  private int mark;
  @Override public final void caretUpdate(CaretEvent e) {
    if (!dragActive) {
      fire(e.getSource());
    }
  }
  @Override public final void mousePressed(MouseEvent e) {
    dragActive = true;
  }
  @Override public final void mouseReleased(MouseEvent e) {
    dragActive = false;
    fire(e.getSource());
  }
  @Override public void keyPressed(KeyEvent e) {
    shiftActive = (e.getModifiersEx() & KeyEvent.SHIFT_DOWN_MASK) != 0;
  }
  @Override public void keyReleased(KeyEvent e) {
    shiftActive = (e.getModifiersEx() & KeyEvent.SHIFT_DOWN_MASK) != 0;
    if (!shiftActive) {
      fire(e.getSource());
    }
  }
  @Override public void keyTyped(KeyEvent e) { /* empty */ }
  private void fire(Object c) {
    if (c instanceof JTextComponent) {
      JTextComponent tc = (JTextComponent) c;
      Caret caret = tc.getCaret();
      int d = caret.getDot();
      int m = caret.getMark();
      if (d != m && (dot != d || mark != m)) {
        String str = tc.getSelectedText();
        if (Objects.nonNull(str)) {
          //StringSelection data = new StringSelection(str);
          //Toolkit tk = Toolkit.getDefaultToolkit();
          //tk.getSystemClipboard().setContents(data, data);
          tc.copy();
        }
      }
      dot = d;
      mark = m;
    }
  }
}
view all

解説

上記のサンプルでは、マウス操作を使って文字列を選択する場合のみ、選択文字列を自動的にクリップボードにコピーするリスナーをJTextAreaに設定しています。

  • マウスのドラッグで文字列選択:
    • ドラッグ終了後に、クリップボードへ選択されている文字列をコピー
  • Shift+カーソルキーによる文字列選択:
    • 無視する Shiftキーをリリース後、クリップボードへ選択されている文字列をコピー
  • Shift+マウスクリックによる文字列選択:
    • マウスリリース後、クリップボードへ選択されている文字列をコピー
  • マウスのダブルクリックによる文字列選択:
    • ダブルクリック終了後、クリップボードへ選択されている文字列をコピー

コメント