---
category: swing
folder: HorizontalAlignmentHeaderRenderer
title: JTableHeaderの字揃えを変更
tags: [JTable, JTableHeader, LookAndFeel, TableCellRenderer]
author: aterai
pubdate: 2010-11-29T14:41:04+09:00
description: JTableHeaderの字揃えをTableCellRendererを使って変更します。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTN5ZuPeZI/AAAAAAAAAbg/Fivi4R1rR-Y/s800/HorizontalAlignmentHeaderRenderer.png
hreflang:
href: https://java-swing-tips.blogspot.com/2016/09/changing-jtable-header-text-alignment.html
lang: en
---
* Summary [#summary]
`JTableHeader`の字揃えを`TableCellRenderer`を使って変更します。
#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTN5ZuPeZI/AAAAAAAAAbg/Fivi4R1rR-Y/s800/HorizontalAlignmentHeaderRenderer.png)
* Source Code Examples [#sourcecode]
#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;
}
}
}}
* Description [#explanation]
* Description [#description]
- `Test1`:
-- `JTableHeader`から`DefaultRenderer`を取得して`setHorizontalAlignment`メソッドで字揃えを設定
-- すべての列の字揃えが変更される
#code{{
((JLabel) table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(SwingConstants.CENTER);
}}
- `Test2`:
-- `DefaultTableCellRenderer`を継承するレンダラーを設定
-- `LookAndFeel`の色などが表示されない?
#code{{
table.getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer() {
@Override 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`列目だけ中央揃えになるが初回が`WindowsLookAndFeel`などの`SystemLookAndFeel`の場合、あとで`LookAndFeel`を変更すると`NullPointerException`が発生する
-- それ以外の場合でもヘッダの`LookAndFeel`が切り替わらない
#code{{
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
// ...
TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer();
// table.getColumnModel().getColumn(0).setHeaderRenderer(new TableCellRenderer() {
table.getTableHeader().setDefaultRenderer(new TableCellRenderer() {
@Override 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;
}
});
}}
* Reference [#reference]
- [[JTableHeaderのフォントを変更>Swing/HeaderFont]]
* Comment [#comment]
#comment
#comment