Swing/HeaderFont のバックアップ(No.13)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/HeaderFont へ行く。
- 1 (2004-08-23 (月) 02:54:09)
- 2 (2004-08-25 (水) 04:49:52)
- 3 (2004-10-08 (金) 06:23:01)
- 4 (2004-11-04 (木) 10:08:26)
- 5 (2005-02-03 (木) 02:04:08)
- 6 (2005-04-28 (木) 04:33:07)
- 7 (2005-11-05 (土) 20:14:39)
- 8 (2006-02-27 (月) 15:59:57)
- 9 (2007-04-03 (火) 22:15:21)
- 10 (2009-03-02 (月) 13:58:54)
- 11 (2010-11-22 (月) 19:57:59)
- 12 (2010-11-23 (火) 03:49:46)
- 13 (2010-11-29 (月) 14:40:10)
- 14 (2011-03-13 (日) 22:08:18)
- 15 (2011-11-24 (木) 06:01:09)
- 16 (2011-11-24 (木) 16:27:57)
- 17 (2011-11-24 (木) 22:16:41)
- 18 (2013-04-11 (木) 22:04:05)
- 19 (2013-05-24 (金) 17:29:04)
- 20 (2014-12-05 (金) 14:21:19)
- 21 (2016-01-12 (火) 17:57:01)
- 22 (2017-06-28 (水) 17:26:32)
- 23 (2017-11-02 (木) 15:32:16)
- 24 (2018-07-01 (日) 00:24:52)
- 25 (2018-10-20 (土) 19:10:44)
- 26 (2020-10-23 (金) 17:57:32)
- 27 (2022-08-07 (日) 00:18:06)
TITLE:JTableHeaderのフォントを変更
Posted by terai at 2004-08-23
JTableHeaderのフォントを変更
TableCellRendererを使って、JTableのヘッダが使用するフォントを変更します。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
JTableHeader h = table.getTableHeader();
Font font = new Font("Sans-serif", Font.PLAIN, 32);
TableCellRenderer hr = h.getDefaultRenderer();
TableColumn col = table.getColumnModel().getColumn(0);
col.setHeaderRenderer(new HeaderRenderer(hr, font));
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);
l.setFont(font);
return l;
}
}
解説
ヘッダを修飾する場合も、セルの場合と同様に、TableCellRendererを実装したセルレンダラーを使います。
サンプルのセルレンダラーは、TableCellRenderer#getTableCellRendererComponentメソッドの中で、委譲しているヘッダのデフォルトのレンダラーから描画に使用するコンポーネント(JLabel)を取得し、そのラベルのフォントだけJLabel#setFontメソッドで置き換えています。
同様の方法で、文字色、背景色、ボーダー、文字の中央揃え、右揃えなども変更することができます。
すべてのヘッダを同じフォントや文字色で変更する場合は、以下のようにUIManagerを使用する方法もあります。
UIManager.put("TableHeader.font", new FontUIResource(font));
- 以下、Swing/HorizontalAlignmentHeaderRendererに移動予定。
- ヘッダの字揃えを以下のように行った場合、フォントの指定は第二列のみ、字揃えは全体に作用する?
col = table.getColumnModel().getColumn(2);
TableCellRenderer hr = table.getTableHeader().getDefaultRenderer();
col.setHeaderRenderer(new HeaderRenderer(hr));
static class HeaderRenderer implements TableCellRenderer {
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;
}
}
- 以下のようにすれば、先頭列だけ中央揃えにできるが、LookAndFeelを変更するとNullPointerExceptionが発生する。
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;
}
});
以下のように変更する。
TableColumnModel m = table.getColumnModel();
m.getColumn(0).setHeaderRenderer(new MyHeaderRenderer(SwingConstants.CENTER));
m.getColumn(1).setHeaderRenderer(new MyHeaderRenderer(SwingConstants.LEFT));
m.getColumn(2).setHeaderRenderer(new MyHeaderRenderer(SwingConstants.LEFT));
class MyHeaderRenderer implements TableCellRenderer{
private int horizontalAlignment = SwingConstants.LEFT;
public HorizontalAlignmentHeaderRenderer(int horizontalAlignment) {
this.horizontalAlignment = horizontalAlignment;
}
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;
}
}