---
category: swing
folder: TableColumnHeaderIcon
title: JTableのカラムヘッダにIconを表示する
tags: [JTable, JTableHeader, TableColumn, Icon]
author: aterai
pubdate: 2016-01-25T01:26:15+09:00
description: JTableの各カラムヘッダにアイコンとタイトル文字列を表示するよう設定します。
image: https://lh3.googleusercontent.com/-yQYpkrDnAcQ/VqT3Oq7tovI/AAAAAAAAOL8/YbbgnXgZ9B4/s800-Ic42/TableColumnHeaderIcon.png
---
* 概要 [#summary]
`JTable`の各カラムヘッダにアイコンとタイトル文字列を表示するよう設定します。

#download(https://lh3.googleusercontent.com/-yQYpkrDnAcQ/VqT3Oq7tovI/AAAAAAAAOL8/YbbgnXgZ9B4/s800-Ic42/TableColumnHeaderIcon.png)

* サンプルコード [#sourcecode]
#code(link){{
URL[] icons = {
    getIconURL("wi0062-16.png"),
    getIconURL("wi0063-16.png"),
    getIconURL("wi0064-16.png")
};
String[] columnNames = {"Column1", "Column2", "Column3"};
JTable table = new JTable(new DefaultTableModel(columnNames, 8));
TableColumnModel m = table.getColumnModel();
for (int i = 0; i < m.getColumnCount(); i++) {
  // m.getColumn(i).setHeaderRenderer(new IconColumnHeaderRenderer());
  m.getColumn(i).setHeaderValue( // cellspacing='0'
    String.format("<html><table cellpadding='0'><td><img src='%s'/></td>%s",
                  icons[i], columnNames[i]));
}
table.setAutoCreateRowSorter(true);
}}

* 解説 [#explanation]
上記のサンプルでは、カラムヘッダにアイコンを表示するために、タイトル文字列として`<img>`タグでアイコンを表示する`html`文字列を設定しています。

- `html`文字列として`String.format("<html><img src='%s'/>&nbsp;%s", url, str)`を使用するとアイコンと文字列のベースラインが揃わない場合があるので`<table>`タグを使用
- `<table>`タグを使用する場合、`JTableHeader`の高さが拡大するので`cellpadding='0' cellspacing='0'`などでセル余白を`0`に変更
- デフォルトのヘッダレンダラーは`JLabel`を継承しているので`setIcon(...)`メソッドが使用可能だが、`LookAndFeel`によってはソートアイコンと競合する場合がある
- デフォルトのヘッダレンダラーは`JLabel`を継承しているので`setIcon(...)`メソッドが使用可能だが、`LookAndFeel`や`UIManager.put("TableHeader.rightAlignSortArrow", Boolean)`の設定によってソートアイコンと競合する場合がある
#code{{
class IconColumnHeaderRenderer implements TableCellRenderer {
  private final Icon icon = new ImageIcon(getClass().getResource("wi0063-16.png"));
  @Override public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus,
      int row, int column)
    TableCellRenderer r = table.getTableHeader().getDefaultRenderer();
    JLabel l = (JLabel) r.getTableCellRendererComponent(
        table, value, isSelected, hasFocus, row, column);
    l.setHorizontalTextPosition(SwingConstants.RIGHT);
    l.setIcon(icon);
    return l;
  }
}
}}

* 参考リンク [#reference]
- [https://xp-style-icons.en.softonic.com/ XP Style Icons - Download]
- [[JTableHeaderのソートアイコンをヘッダセル右揃えで表示する>Swing/TableHeaderRightAlignSortArrow]]

* コメント [#comment]
#comment
#comment