概要

Highlighter.HighlightPainterを使用したハイライト表示では文字色が変更不可なので、JTextPaneStyleを設定してこれを同時に適用します。

サンプルコード

StyledDocument doc = textPane.getStyledDocument();
Style def = doc.getStyle(StyleContext.DEFAULT_STYLE);
Style htf = doc.addStyle("highlight-text-foreground", def);
StyleConstants.setForeground(htf, new Color(0xFF_DD_FF));
// ...

//clear the previous highlight:
Highlighter highlighter = textPane.getHighlighter();
for (Highlighter.Highlight h: highlighter.getHighlights()) {
  doc.setCharacterAttributes(
      h.getStartOffset(), h.getEndOffset() - h.getStartOffset(), def, true);
}
highlighter.removeAllHighlights();
// ...

//match highlighting:
Highlighter.Highlight hh = highlighter.getHighlights()[current];
highlighter.removeHighlight(hh);
highlighter.addHighlight(
    hh.getStartOffset(), hh.getEndOffset(), currentPainter);
doc.setCharacterAttributes(
    hh.getStartOffset(), hh.getEndOffset() - hh.getStartOffset(), s, true);
scrollToCenter(textPane, hh.getStartOffset());
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JTextAreaでハイライト付き検索を行うで使用したコードに以下のような変更を追加することで検索結果のハイライト表示と文字色変更を同時に行っています。

  • StyledDocumentにスタイル名highlight-text-foregroundで文字色のみデフォルトから変更したStyleを追加
  • 検索結果のハイライト(背景)と同時にStyledDocument#getStyle("highlight-text-foreground")で取得したStyleStyledDocument#setCharacterAttributes(...)で上書き追加
    • 現在の対象になっている検索結果以外はStyledDocument#getStyle("highlight-text-foreground")Styleで文字色を元に元に戻す

参考リンク

コメント