JTableのセル文字揃え
Total: 28873
, Today: 7
, Yesterday: 3
Posted by aterai at
Last-modified:
概要
JTable
のセルに表示されている文字列の揃えを変更します。
Screenshot
Advertisement
サンプルコード
TableColumn col = table.getColumnModel().getColumn(1);
col.setCellRenderer(new HorizontalAlignmentTableRenderer());
// ...
class HorizontalAlignmentTableRenderer extends DefaultTableCellRenderer {
@Override public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component c = super.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(SwingConstants.LEFT);
} else if (centerRadio.isSelected()) {
l.setHorizontalAlignment(SwingConstants.CENTER);
} else if (rightRadio.isSelected()) {
l.setHorizontalAlignment(SwingConstants.RIGHT);
} else if (customRadio.isSelected()) {
l.setHorizontalAlignment(row % 3 == 0 ? SwingConstants.LEFT:
row % 3 == 1 ? SwingConstants.CENTER:
SwingConstants.RIGHT);
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JTable
の第1
列目のセルに表示されている文字列の揃えを変更するテストを行っています。
left
: 左揃えcenter
: 中央揃えright
: 右揃えcustom
: 行ごとに左、中央、右揃えを変更
JTable
は、Object
、Number
、Boolean
クラスのデフォルトセルレンダラーを持っているため、モデルが各列のクラスを正しく返すようにTableModel#getColumnClass(int)
をオーバーライドすることでそのクラスのデフォルトセルレンダラーが使用されるObject
:SwingConstants.LEFT
(文字列などは左揃え)Number
:SwingConstants.RIGHT
(数字は右揃え)Boolean
:JCheckBox
,CENTER
(チェックボックスは中央揃え)
DefaultTableModel#TableModel#getColumnClass(int)
のデフォルトは、すべての列のクラスとしてObject.class
を返す- 各クラスのデフォルトセルレンダラーが使用されるのは、列にセルレンダラーが割り当てられていない場合に限られる
// 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(SwingConstants.CENTER); table.getColumnModel().getColumn(2).setCellRenderer(r);
参考リンク
- JTableHeaderの字揃え
- ヘッダの文字揃えに関するテストは、上記の場所に移動
- JTableのセル内文字列を両端揃えにする