概要
JFrame
がアクティブであるかどうかでその子JTextComponent
のテキスト選択ハイライトの背景色を変更します。
Screenshot
Advertisement
サンプルコード
class FocusOwnerCaret extends DefaultCaret {
private static final Color COLOR = Color.GRAY.brighter();
private static final HighlightPainter NO_FOCUS_PAINTER =
new DefaultHighlightPainter(COLOR);
@Override public void focusLost(FocusEvent e) {
super.focusLost(e);
updateSelectionHighlightPainter();
}
@Override public void focusGained(FocusEvent e) {
super.focusGained(e);
updateSelectionHighlightPainter();
}
private void updateSelectionHighlightPainter() {
setSelectionVisible(false); // removeHighlight
setSelectionVisible(true); // addHighlight
}
@Override protected Highlighter.HighlightPainter getSelectionPainter() {
JTextComponent c = getComponent();
Container w = c.getTopLevelAncestor();
// boolean isFocused = w instanceof Window && ((Window) w).isFocused();
boolean isActive = w instanceof Window && ((Window) w).isActive();
return c.hasFocus() && isActive ? super.getSelectionPainter() : NO_FOCUS_PAINTER;
// https://ateraimemo.com/Swing/CaretSelectionHighlight.html
// return c.hasFocus() ? super.getSelectionPainter() : NO_FOCUS_PAINTER;
}
}
View in GitHub: Java, Kotlin解説
Default
- フォーカスが同じ
JFrame
内の別コンポーネントに移動するとテキスト選択ハイライトは非表示になる - 別アプリケーションのフレームが選択されて親
JFrame
が非アクティブ化されてもテキスト選択ハイライトは変化しない
- フォーカスが同じ
Custom
- JTextAreaでのCaretによる選択状態表示を維持すると同様の
Caret
をJTextArea
に設定し、フォーカスが同じJFrame
内の別コンポーネントに移動するとテキスト選択ハイライトを灰色に変更して表示状態を維持する - 別アプリケーションのフレームが選択されて親
JFrame
が非アクティブ化されるとDefaultCaret
のfocusLost
イベントが発生するのでWindow#isActive()メソッドで親JFrame
のアクティブ状態を調査しテキスト選択ハイライトの背景色を変更する
- JTextAreaでのCaretによる選択状態表示を維持すると同様の
参考リンク
- JTextAreaでのCaretによる選択状態表示を維持する
- Window#isActive() (Java Platform SE 8)
KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow()
と自身を比較
- Window#isFocused() (Java Platform SE 8)
KeyboardFocusManager.getCurrentKeyboardFocusManager().getGlobalFocusedWindow()
と自身を比較
- Window#getFocusOwner() (Java Platform SE 8)
Window#isFocused() == true
ならKeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner()
を返す
- JTabbedPaneのタブ選択で表示状態になったタブコンポーネントにフォーカスを移動する