TITLE:JTableHeaderのフォントを変更
Posted by terai at 2004-08-23

JTableHeaderのフォントを変更

TableCellRendererを使って、JTableのヘッダが使用するフォントを変更します。
  • category: swing folder: HeaderFont title: JTableHeaderのフォントを変更 tags: [JTable, JTableHeader, TableCellRenderer, UIManager] author: aterai pubdate: 2004-08-23T02:54:09+09:00 description: TableCellRendererを使って、JTableのヘッダが使用するフォントを変更します。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTNshbAJvI/AAAAAAAAAbM/xYo1iOQ9fxU/s800/HeaderFont.png

概要

TableCellRendererを使って、JTableのヘッダが使用するフォントを変更します。

#screenshot

サンプルコード

#spanend
#spandel
JTableHeader h = table.getTableHeader();
#spanend
#spandel
Font font = new Font("Sans-serif", Font.PLAIN, 32);
#spanend
#spandel
TableCellRenderer hr = h.getDefaultRenderer();
#spanend
#spandel
TableColumn col = table.getColumnModel().getColumn(0);
#spanend
#spandel
col.setHeaderRenderer(new HeaderRenderer(hr, font));
#spanend
#spandel

#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
class HeaderRenderer implements TableCellRenderer {
  private final TableCellRenderer tcr;
  private final Font font;
  public HeaderRenderer(TableCellRenderer tcr, Font font) {
    this.tcr  = tcr;
    this.font = font;
  }
  public Component getTableCellRendererComponent(JTable tbl, Object val,
                          boolean isS, boolean hasF, int row, int col) {
    JLabel l = (JLabel)tcr.getTableCellRendererComponent(
                                        tbl, val, isS, hasF, row, col);
  private final Font font = new Font(Font.SANS_SERIF, Font.PLAIN, 32);
  @Override public Component getTableCellRendererComponent(JTable t,
      Object val, boolean isS, boolean hasF, int row, int col) {
    TableCellRenderer r = t.getTableHeader().getDefaultRenderer();
    JLabel l = (JLabel) r.getTableCellRendererComponent(t, val, isS, hasF, row, col);
    l.setFont(font);
    return l;
  }
}

解説

ヘッダを修飾する場合も、セルの場合と同様に、TableCellRendererを実装したセルレンダラーを使います。

解説

上記のサンプルでは、0番目のカラムヘッダだけフォントを変更しています。JTableHeaderのセルを修飾する場合もJTable中のセルの場合と同様にTableCellRendererを実装したセルレンダラーが使用可能です。 サンプルのセルレンダラーは、TableCellRenderer#getTableCellRendererComponentメソッドの中で、委譲しているヘッダのデフォルトのレンダラーから描画に使用するコンポーネント(JLabel)を取得し、そのラベルのフォントだけJLabel#setFontメソッドで置き換えています。 サンプルのセルレンダラーは、TableCellRenderer#getTableCellRendererComponent(...)メソッドの中で委譲しているヘッダのデフォルトのレンダラーから描画に使用するコンポーネント(JLabel)を取得し、そのラベルのフォントだけJLabel#setFont(...)メソッドで置き換えています。 同様の方法で、文字色、背景色、ボーダー、文字の中央揃え、右揃えなども変更することができます。 すべてのヘッダを同じフォントや文字色で変更する場合は、以下のようにUIManagerを使用する方法もあります。
  • 同様の方法で文字色、背景色、ボーダー、文字の中央揃え、右揃えなども変更可能
  • コメントでいつも見てますさんが指摘しているようにJTableHeader#setFont()メソッドを使用すると全カラムヘッダのフォントを指定可能
    #spandel
    UIManager.put("TableHeader.font", new FontUIResource(font));
    #spanend
    #spanadd
    table.getTableHeader().setFont(font);
    #spanend
    
  • -
  • テスト中
    • メモ:Default Table Header Cell Renderer Java Tips Weblog
    • ヘッダの字揃えを以下のように行った場合、フォントの指定は第二列のみ、字揃えは全体に作用する?
    • Microsoft Windows XP [Version 5.1.2600]
    • Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
  • すべてのJTableのヘッダを同じフォントや文字色で変更する場合は以下のようにUIManagerを使用する方法もある
    #spandel
    col = table.getColumnModel().getColumn(2);
    #spanend
    #spandel
    TableCellRenderer hr = table.getTableHeader().getDefaultRenderer();
    #spanend
    #spandel
    col.setHeaderRenderer(new HeaderRenderer(hr));
    #spanend
    #spanadd
    UIManager.put("TableHeader.font", new FontUIResource(font));
    #spanend
    
    #spanend
    #spandel
    static class HeaderRenderer implements TableCellRenderer {
    #spanend
      private final TableCellRenderer renderer;
      private final Font font = new Font("Sans-serif", Font.BOLD, 14);
      public HeaderRenderer(TableCellRenderer renderer) {
        this.renderer  = renderer;
      }
      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);
        l.setHorizontalAlignment(JLabel.CENTER);
        l.setFont(font);
        return l;
      }
    #spandel
    }
    #spanend
    #spandel
    

参考リンク

参考リンク

コメント

コメント