Posted by terai at 2008-08-25
JTableのセル文字揃え
JTableのセルに表示されている文字列の揃えを変更します。
サンプルコード
TableColumn col = table.getColumnModel().getColumn(1); col.setCellRenderer(new HorizontalAlignmentTableRenderer( new DefaultTableCellRenderer()));
class HorizontalAlignmentTableRenderer implements TableCellRenderer {
private final TableCellRenderer renderer;
public HorizontalAlignmentTableRenderer(TableCellRenderer renderer) {
this.renderer = renderer;
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
Component c = renderer.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
if(c instanceof JLabel) initLabel((JLabel)c, row);
return c;
}
private void initLabel(JLabel l, int row) {
if(leftRadio.isSelected()) {
l.setHorizontalAlignment(JLabel.LEFT);
}else if(centerRadio.isSelected()) {
l.setHorizontalAlignment(JLabel.CENTER);
}else if(rightRadio.isSelected()) {
l.setHorizontalAlignment(JLabel.RIGHT);
}else if(customRadio.isSelected()) {
l.setHorizontalAlignment(row%3==0?JLabel.LEFT:
row%3==1?JLabel.CENTER:
JLabel.RIGHT);
}
}
}
解説
上記のサンプルでは、上部のラジオボタン*1で、第一列のセル文字列の揃えを変更することができます。
- left: 左揃え
- center: 中央揃え
- rihgt: 右揃え
- custom: 行ごとに左、中央、右揃えを変更
JTableは、Object、Number、Booleanクラスのデフォルトセルレンダラーを持っているため、モデル*2が各列のクラスを正しく返すように、TableModel#getColumnClass(int)をオーバーライドしてやると、そのクラスのデフォルトセルレンダラーが使用され*3、表示は数字右揃え、文字列左揃えになります。
- Object: JLabel.LEFT
- Number: JLabel.RIGHT
- Boolean: JCheckBox, CENTER
//JTableの手抜きサンプルなら、以下のようにオーバーライドするのが簡単?
String[] columnNames = {"String", "Integer", "Boolean"};
Object[][] data = {
{"AAA", 1, true},
{"BBB", 2, false},
};
DefaultTableModel model = new DefaultTableModel(data, columnNames) {
@Override
public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
JTable table = new JTable(model);
クラスのデフォルトセルレンダラーではなく、任意の列にセルレンダラーを割り当てて、例えば中央揃えにしたい場合は、以下のように設定します。
DefaultTableCellRenderer r = new DefaultTableCellRenderer(); r.setHorizontalAlignment(JLabel.CENTER); table.getColumnModel().getColumn(2).setCellRenderer(r);
参考リンク
- JTableHeaderのフォントを変更
- ヘッダの文字揃えに関するテストは、上記の場所に移動
コメント
*1 JTable、ラジオボタンで検索してこのページに来てる人がいるので、リンク: JTableのセル中にJRadioButtonを配置
*2 DefaultTableModelはすべての列のクラスとして、Object.classを返す
*3 列にセルレンダラーが割り当てられていない場合