• title: JTextAreaで単語選択を実行した場合の区切り文字を変更する tags: [JTextArea, Segment, Document] author: aterai pubdate: 2016-05-09T00:37:01+09:00 description: JTextAreaで文字列のダブルクリックによる単語選択を実行した場合、単語の区切りとみなす文字を追加します。

概要

JTextAreaで文字列のダブルクリックによる単語選択を実行した場合、単語の区切りとみなす文字を追加します。

サンプルコード

//@see javax.swint.text.Utilities.getWordStart(...)
int getWordStart(JTextComponent c, int offs) throws BadLocationException {
  Element line = Utilities.getParagraphElement(c, offs);
  if (line == null) {
    throw new BadLocationException("No word at " + offs, offs);
  }
  Document doc = c.getDocument();
  int lineStart = line.getStartOffset();
  int lineEnd = Math.min(line.getEndOffset(), doc.getLength());
  int offs2 = offs;
  Segment seg = SegmentCache.getSharedSegment();
  doc.getText(lineStart, lineEnd - lineStart, seg);
  if (seg.count > 0) {
    BreakIterator words = BreakIterator.getWordInstance(c.getLocale());
    words.setText(seg);
    int wordPosition = seg.offset + offs - lineStart;
    if (wordPosition >= words.last()) {
      wordPosition = words.last() - 1;
      words.following(wordPosition);
      offs2 = lineStart + words.previous() - seg.offset;
    } else {
      words.following(wordPosition);
      offs2 = lineStart + words.previous() - seg.offset;
      for (int i = offs; i > offs2; i--) {
        char ch = seg.charAt(i - seg.offset);
        if (ch == '_' || ch == '-') {
          offs2 = i + 1;
          break;
        }
      }
    }
  }
  SegmentCache.releaseSharedSegment(seg);
  return offs2;
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JTextAreaで文字列をダブルクリックした場合に実行される単語選択アクション(new TextAction(DefaultEditorKit.selectWordAction))を変更し、常に_-記号で単語を区切るように設定しています。元の単語選択アクションは、クリックした位置から単語の先頭、末尾を探す方法として、javax.swint.text.UtilitiesgetWordEnd(...)getWordEnd(...)メソッドを使用しているので、これをコピーし、BreakIterator.getWordInstance(c.getLocale())で見つけた単語内に_-が存在するか再度検索するよう改変しています。

コメント