• title: JTextPaneで検索結果のハイライト表示と文字色変更を同時に行う tags: [JTextPane, StyledDocument, Style, Highlighter, Matcher, Pattern] author: aterai pubdate: 2014-11-10T00:02:14+09:00 description: Highlighter.HighlightPainterを使用したハイライト表示では文字色を変更することが出来ないので、JTextPaneにStyleを適用してこれを同時に行います。

概要

Highlighter.HighlightPainterを使用したハイライト表示では文字色を変更することが出来ないので、JTextPaneStyleを適用してこれを同時に行います。

サンプルコード

StyledDocument doc = textPane.getStyledDocument();
Style def = StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
Style regular = doc.addStyle("regular", def);
Style htf = doc.addStyle("highlight-text-foreground", regular);
StyleConstants.setForeground(htf, new Color(0xFFDDFF));
//...
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に名称"regular"Styleを追加
  • StyledDocumentに親Style"regular"で、名称"highlight-text-foreground"、文字色のみ変更したStyleを追加
  • 検索結果のハイライト(背景)と同時に、StyledDocument#getStyle("highlight-text-foreground")で取得したStyleStyledDocument#setCharacterAttributes(...)で、上書き追加
    • 現在の対象になっている検索結果以外は、StyledDocument#getStyle("highlight-text-foreground")Styleで文字色を元に元に戻す

参考リンク

コメント