Swing/CaretSelectionHighlight のバックアップ(No.11)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/CaretSelectionHighlight へ行く。
- 1 (2015-03-16 (月) 01:10:01)
- 2 (2017-01-11 (水) 19:17:06)
- 3 (2017-04-07 (金) 13:51:51)
- 4 (2017-12-14 (木) 16:28:53)
- 5 (2019-08-27 (火) 16:15:05)
- 6 (2021-04-20 (火) 20:00:26)
- 7 (2025-01-03 (金) 08:57:02)
- 8 (2025-01-03 (金) 09:01:23)
- 9 (2025-01-03 (金) 09:02:38)
- 10 (2025-01-03 (金) 09:03:21)
- 11 (2025-01-03 (金) 09:04:02)
- category: swing
folder: CaretSelectionHighlight
title: JTextAreaでのCaretによる選択状態表示を維持する
tags: [JTextArea, Highlighter, Caret, Focus, JTextComponent]
author: aterai
pubdate: 2015-03-16T01:08:13+09:00
description: JTextAreaなどのJTextComponentに、フォーカスがない場合でも文字列の選択状態をハイライト表示するCaretを設定します。
image:
Summary
JTextArea
などのJTextComponent
に、フォーカスがない場合でも文字列の選択状態をハイライト表示するCaret
を設定します。
Screenshot

Advertisement
Source Code Examples
class FocusCaret extends DefaultCaret {
DefaultHighlighter.DefaultHighlightPainter nonFocusHighlightPainter
= new DefaultHighlighter.DefaultHighlightPainter(Color.GRAY.brighter());
@Override public void focusLost(FocusEvent e) {
super.focusLost(e);
setSelectionVisible(true);
}
@Override public void focusGained(FocusEvent e) {
super.focusGained(e);
setSelectionVisible(false); // removeHighlight
setSelectionVisible(true); // addHighlight
}
@Override protected Highlighter.HighlightPainter getSelectionPainter() {
return getComponent().hasFocus() ? DefaultHighlighter.DefaultPainter
: nonFocusHighlightPainter;
}
}
View in GitHub: Java, KotlinExplanation
上記のサンプルでは、JInternalFrame
の選択を切り替えることでその内部のJTextArea
のフォーカスを変更し、文字列の選択状態ハイライトがどう変化するかをテストしています。
DefaultCaret
- フォーカスがなくなると、選択状態ハイライトは非表示になる
FocusCaret
DefaultCaret#focusLost(...)
をオーバーライドし、フォーカスがなくなってもDefaultCaret#setSelectionVisible(true)
を実行して選択状態ハイライトを表示状態に戻すDefaultCaret#getSelectionPainter()
をオーバーライドし、フォーカスがない場合のハイライト色を変更DefaultCaret#focusGained(...)
をオーバーライドしてフォーカスがこのキャレットのコンポーネントに移動すると、一旦ハイライトを削除してデフォルトのハイライト色を元に戻しあらためて選択状態ハイライトを表示状態にする