Swing/BorderHighlightPainter の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/BorderHighlightPainter へ行く。
- Swing/BorderHighlightPainter の差分を削除
--- category: swing folder: BorderHighlightPainter title: JTextAreaの検索ハイライトに縁を描画する tags: [JTextArea, Highlighter, Highlighter.HighlightPainter, Border] tags: [JTextArea, Highlighter, HighlightPainter, Border] author: aterai pubdate: 2024-02-12T19:09:38+09:00 description: JTextAreaの検索文字列に適用するハイライトに縁色を設定します。 image: https://drive.google.com/uc?id=1GPgC3RJq-ZBoxlGhY6xMpwQDo7OlXOgQ --- * 概要 [#summary] `JTextArea`の検索文字列に適用するハイライトに縁色を設定します。 #download(https://drive.google.com/uc?id=1GPgC3RJq-ZBoxlGhY6xMpwQDo7OlXOgQ) * サンプルコード [#sourcecode] #code(link){{ Highlighter.Highlight hh = highlighter.getHighlights()[idx]; highlighter.removeHighlight(hh); HighlightPainter currentPainter = new DefaultHighlightPainter(Color.ORANGE) { @Override public Shape paintLayer( Graphics g, int offs0, int offs1, Shape bounds, JTextComponent c, View view) { Shape s = super.paintLayer(g, offs0, offs1, bounds, c, view); if (s instanceof Rectangle) { Graphics2D g2 = (Graphics2D) g.create(); g2.setPaint(Color.RED); Rectangle r = s.getBounds(); // g2.draw(r); g2.drawRect(r.x, r.y, r.width - 1, r.height - 1); g2.dispose(); } return s; } }; try { highlighter.addHighlight( hh.getStartOffset(), hh.getEndOffset(), currentPainter); scrollToCenter(textArea, hh.getStartOffset()); } catch (BadLocationException ex) { // should never happen RuntimeException wrap = new StringIndexOutOfBoundsException( ex.offsetRequested()); wrap.initCause(ex); throw wrap; } }} * 解説 [#explanation] - 検索にマッチした文字列のハイライト -- `DefaultHighlighter.DefaultHighlightPainter(Color.ORANGE)`でハイライト背景色を`Color.ORANGE`に設定した`HighlightPainter`を使用 - 検索にマッチした文字列のうち現在選択されているハイライト -- `DefaultHighlighter.DefaultHighlightPainter#paintLayer(...)`をオーバーライドして、ハイライト図形の縁を追加描画 -- `paintLayer(...)`メソッドの引数の`Shape bounds`は`JTextComponent`の現在表示されている領域で戻り値が`offs0...offs1`の範囲の文字列領域となるので、`super.paintLayer(g, offs0, offs1, bounds, c, view)`を実行して取得した図形に縁を描画している * 参考リンク [#reference] - [[JTextComponentの選択ハイライトを変更>Swing/SelectionHighlightPainter]] - [[JTextAreaでハイライト付き検索を行う>Swing/HighlightSearch]] -- 検索ハイライト機能はこちらのサンプルと同一 - [[JTextPaneで検索結果のハイライト表示と文字色変更を同時に行う>Swing/HighlightTextForeground]] -- こちらは`JTextPane`で`HighlightPainter`ではなく`html`タグでハイライトの描画を変更するサンプル * コメント [#comment] #comment #comment