TITLE:JTableHeaderの字揃えを変更
#navi(../)
RIGHT:Posted by &author(aterai); at 2010-11-29
*JTableHeaderの字揃えを変更 [#kd2e1845]
JTableHeaderの字揃えを変更します。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(http://lh5.ggpht.com/_9Z4BYR88imo/TQTN5ZuPeZI/AAAAAAAAAbg/Fivi4R1rR-Y/s800/HorizontalAlignmentHeaderRenderer.png)

**サンプルコード [#od4f9b74]
#code(link){{
class HorizontalAlignmentHeaderRenderer implements TableCellRenderer{
  private int horizontalAlignment = SwingConstants.LEFT;
  public HorizontalAlignmentHeaderRenderer(int horizontalAlignment) {
    this.horizontalAlignment = horizontalAlignment;
  }
  @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.setHorizontalAlignment(horizontalAlignment);
    return l;
  }
}
}}

**解説 [#y547a05a]
- Test1:
-- JTableHeaderから、DefaultRenderer を取得し、setHorizontalAlignmentメソッドで字揃えを設定
-- すべての列の字揃えが変更される
#code{{
((JLabel)table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(SwingConstants.CENTER);
}}

- Test2:
-- DefaultTableCellRendererを継承するレンダラーを設定
-- LookAndFeelの色などが表示されない?
#code{{
table.getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer() {
  public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {
    super.getTableCellRendererComponent(
        table,value,isSelected,hasFocus,row,column);
    setHorizontalAlignment(SwingConstants.CENTER);
    return this;
    }
});
}}

- Test3:
-- TableCellRenderer#getTableCellRendererComponent(...)メソッド内で、デフォルトのヘッダレンダラーを取得し、字揃えを設定
-- 上記のHorizontalAlignmentHeaderRendererを全ての列に設定
#code{{
table.getColumnModel().getColumn(0).setHeaderRenderer(
    new HorizontalAlignmentHeaderRenderer(SwingConstants.LEFT));
table.getColumnModel().getColumn(1).setHeaderRenderer(
    new HorizontalAlignmentHeaderRenderer(SwingConstants.CENTER));
table.getColumnModel().getColumn(2).setHeaderRenderer(
    new HorizontalAlignmentHeaderRenderer(SwingConstants.RIGHT));
}}

----
以下の方法でも 0列目だけ中央揃えにすることが可能だが、初回がWindowsLnFなどのSystemLookAndFeelの場合、LookAndFeelを変更するとNullPointerExceptionが発生する(それ以外の場合でもヘッダのLnFが切り替わらない)。
#code{{
try{
  UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(Exception e) {
  e.printStackTrace();
}
//...
final TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer();
//table.getColumnModel().getColumn(0).setHeaderRenderer(new TableCellRenderer() {
table.getTableHeader().setDefaultRenderer(new TableCellRenderer() {
  public Component getTableCellRendererComponent(JTable table, Object value,
          boolean isSelected, boolean hasFocus, int row, int column) {
    JLabel l = (JLabel)renderer.getTableCellRendererComponent(
          table,value,isSelected,hasFocus,row,column);
    if(table.convertColumnIndexToModel(column)==0) {
      l.setHorizontalAlignment(SwingConstants.CENTER);
    }else{
      l.setHorizontalAlignment(SwingConstants.LEFT);
    }
    return l;
  }
});
}}

**参考リンク [#s123999d]
-[[JTableHeaderのフォントを変更>Swing/HeaderFont]]

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