JTableHeaderの字揃えを変更
Total: 11102
, Today: 1
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
JTableHeader
の字揃えをTableCellRenderer
を使って変更します。
Screenshot
Advertisement
サンプルコード
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;
}
}
View in GitHub: Java, Kotlin解説
Test1
:JTableHeader
からDefaultRenderer
を取得してsetHorizontalAlignment
メソッドで字揃えを設定- すべての列の字揃えが変更される
((JLabel) table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(SwingConstants.CENTER);
Test2
:DefaultTableCellRenderer
を継承するレンダラーを設定LookAndFeel
の色などが表示されない?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
を全ての列に設定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
が切り替わらない
- それ以外の場合でもヘッダの
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;
}
});