• category: swing folder: TableCellHtmlHighlighter title: JTableのセル内文字列をHTMLタグを使用してハイライト tags: [JTable, HTML, JLabel, TableCellRenderer, NimbusLookAndFeel] author: aterai pubdate: 2017-11-13T15:19:39+09:00 description: JTableのセル内文字列をHTMLタグを使用して強調表示します。 image: https://drive.google.com/uc?id=1PqzXSbIvazI6-v8INSlkDS2FOv7LtY-u-Q

概要

JTableのセル内文字列をHTMLタグを使用して強調表示します。

サンプルコード

class HighlightTableCellRenderer extends DefaultTableCellRenderer {
  private static final String SPAN =
    "%s<span style='color:#000000; background-color:#FFFF00'>%s</span>";
  private String pattern = "";
  private String prev;

  public boolean setPattern(String str) {
    if (Objects.equals(str, pattern)) {
      return false;
    } else {
      prev = pattern;
      pattern = str;
      return true;
    }
  }
  @Override public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus,
      int row, int column) {
    String txt = Objects.toString(value, "");
    if (Objects.nonNull(pattern) && !pattern.isEmpty() && !Objects.equals(pattern, prev)) {
      Matcher matcher = Pattern.compile(pattern).matcher(txt);
      int pos = 0;
      StringBuilder buf = new StringBuilder("<html>");
      while (matcher.find(pos) && !matcher.group().isEmpty()) {
        int start = matcher.start();
        int end = matcher.end();
        buf.append(String.format(SPAN,
                                 txt.substring(pos, start), txt.substring(start, end)));
        pos = end;
      }
      buf.append(txt.substring(pos));
      txt = buf.toString();
    }
    super.getTableCellRendererComponent(table, txt, isSelected, hasFocus, row, column);
    return this;
  }
}
View in GitHub: Java, Kotlin

解説

  • 行のフィルタリング
  • セル中文字列のハイライト
    • JTableの検索結果をRowFilterとHighlighterで強調表示するはセルレンダラーとしてJTextFieldを使用し、JTextField#getHighlighter()#addHighlight(...)でハイライト表示しているが、このサンプルでは、JLabelを継承するDefaultTableCellRendererHTMLタグを適用した文字列を生成することでハイライト表示
      • ハイライトの背景色だけではなく文字色も変更可能なので、JTableのセル選択文字色、背景色にデフォルト色が使用可能
      • 例えばNimbusLookAndFeelなどのようにセルを選択すると文字色が白抜き反転されるLookAndFeelJTextField#getHighlighter()#addHighlight(...)を使用する場合、セル文字色を黒に固定してセル選択背景色をハイライト背景色より薄い色に変更するなどの対策が必要

参考リンク

コメント