JTextArea内の文字列がマウス操作で選択されたら自動的にコピーする
Total: 5634
, Today: 2
, Yesterday: 5
Posted by aterai at
Last-modified:
概要
JTextArea
内の文字列がマウス操作で選択された場合のイベントを取得するMouseListener
とCaretListener
を設定し、その選択文字列を自動的にクリップボードにコピーする機能を追加します。
Screenshot
Advertisement
サンプルコード
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 in GitHub: Java, Kotlin解説
上記のサンプルでは、マウス操作を使って文字列を選択する場合、選択文字列を自動的にクリップボードにコピーするリスナーをJTextArea
に設定しています。
- マウスのドラッグで文字列選択:
- マウスドラッグ終了後クリップボードに選択文字列をコピー
- Shift+カーソルキーによる文字列選択:
- Shiftキーをリリース後クリップボードに選択文字列をコピー
- Shift+マウスクリックによる文字列選択:
- マウスリリース後クリップボードに選択文字列をコピー
- マウスのダブルクリックによる文字列選択:
- ダブルクリック終了後クリップボードに選択文字列をコピー