Swing/CaretSelectionHighlight のバックアップ差分(No.6)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/CaretSelectionHighlight へ行く。
- 追加された行はこの色です。
- 削除された行はこの色です。
--- 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: https://lh5.googleusercontent.com/-weYSCZJkVwc/VQWpURBqaVI/AAAAAAAAN0U/1vFVeG8fLy4/s800/CaretSelectionHighlight.png --- * 概要 [#summary] `JTextArea`などの`JTextComponent`に、フォーカスがない場合でも文字列の選択状態をハイライト表示する`Caret`を設定します。 #download(https://lh5.googleusercontent.com/-weYSCZJkVwc/VQWpURBqaVI/AAAAAAAAN0U/1vFVeG8fLy4/s800/CaretSelectionHighlight.png) * サンプルコード [#sourcecode] #code(link){{ 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 setSelectionVisible(false); // removeHighlight setSelectionVisible(true); // addHighlight } @Override protected Highlighter.HighlightPainter getSelectionPainter() { return getComponent().hasFocus() ? DefaultHighlighter.DefaultPainter : nonFocusHighlightPainter; } } }} * 解説 [#explanation] 上記のサンプルでは、`JInternalFrame`の選択を切り替えることで、その内部の`JTextArea`のフォーカスを変更し、文字列の選択状態ハイライトがどう変化するかをテストしています。 上記のサンプルでは、`JInternalFrame`の選択を切り替えることでその内部の`JTextArea`のフォーカスを変更し、文字列の選択状態ハイライトがどう変化するかをテストしています。 - `DefaultCaret` -- フォーカスがなくなると、選択状態ハイライトは非表示になる - `FocusCaret` -- `DefaultCaret#focusLost(...)`をオーバーライドし、フォーカスがなくなっても`DefaultCaret#setSelectionVisible(true)`を実行して選択状態ハイライトを表示状態に戻す -- `DefaultCaret#getSelectionPainter()`をオーバーライドし、フォーカスがない場合のハイライト色を変更 -- `DefaultCaret#focusGained(...)`をオーバーライドし、フォーカスがこのキャレットのコンポーネントに移動すると一旦ハイライトを削除してデフォルトのハイライト色を元に戻し、あらためて選択状態ハイライトを表示状態にする * 参考リンク [#reference] - [https://stackoverflow.com/questions/18237317/how-to-retain-selected-text-in-jtextfield-when-focus-lost java - How to retain selected text in JTextField when focus lost? - Stack Overflow] * コメント [#comment] #comment #comment