Swing/ToolTipOnMouseOverOfWord のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ToolTipOnMouseOverOfWord へ行く。
- 1 (2024-03-25 (月) 03:01:20)
- category: swing folder: ToolTipOnMouseOverOfWord title: JTextArea内の単語上にマウスカーソルでJToolTipを表示する tags: [JTextArea, JToolTip, JTextComponent] author: aterai pubdate: 2024-03-25T02:42:05+09:00 description: JTextArea内でマウスカーソルが乗った単語の開始オフセットなどをJToolTipで表示します。 image: https://drive.google.com/uc?id=1G7tL6PLzVdyUZ9P6PlMM1sFE1QngbLup
概要
JTextArea内でマウスカーソルが乗った単語の開始オフセットなどをJToolTipで表示します。
Screenshot
Advertisement
サンプルコード
JTextArea textArea = new JTextArea(txt) {
@Override public String getToolTipText(MouseEvent e) {
// Java 9: int pos = viewToModel2D(e.getPoint());
int pos = viewToModel(e.getPoint());
String tipText = super.getToolTipText(e);
try {
int start = Utilities.getWordStart(this, pos);
int end = Utilities.getWordEnd(this, start);
String word = getText(start, end - start);
// Java 11: if (!word.isBlank()) {
if (!word.trim().isEmpty()) {
tipText = String.format("%s(%d-%d)", word, start, end);
}
} catch (BadLocationException ex) {
UIManager.getLookAndFeel().provideErrorFeedback(this);
}
return tipText;
}
};
View in GitHub: Java, Kotlin解説
JTextArea#getToolTipText(MouseEvent)
をオーバーライドして以下の手順で単語を取得JTextComponent#viewToModel(Point)
でマウスカーソル位置(MouseEvent.getPoint()
)のドキュメントの先頭からのオフセットを取得Utilities.getWordStart(textArea, offset)
で指定したオフセット近くの単語の開始オフセットを取得Utilities.getWordEnd(textArea, offset)
で指定したオフセット近くの単語の終了オフセットを取得- JTextComponent#getText(offs, len)で単語文字列を取得
- 取得した文字列が空白のみや空でなければ
ToolTipText
として使用する
Utilities.getWordStart(...)
などの内部でBreakIterator.getWordInstance(c.getLocale())
を使用しているので日本語環境で実行すれば記号、漢字、ひらがな、カタカナなどの区切りで単語を取得可能- Utilities#getWordStart(...)、Utilities#getWordEnd(...)、Utilities#getNextWord(...)などのドキュメントすべてに「
BreakIterator.getWordInstance()
を使用すると、実際に語を取得できます。」と記述されているが意味がよく分からないUtilities.getWordStart(...)
などの内部ではBreakIterator.getWordInstance(c.getLocale())
を使用して単語を取得してからその開始オフセット、終了オフセットを取得しているのでUtilities.getWordStart(...)
、Utilities.getWordEnd(...)
、JTextComponent#getText(...)
を実行しなくても一回のBreakIterator.getWordInstance(c.getLocale())
で単語取得可能の意味?