Swing/CellTextAlignment のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/CellTextAlignment へ行く。
- 1 (2008-08-25 (月) 14:45:47)
- 2 (2008-08-26 (火) 13:50:46)
- 3 (2008-09-24 (水) 12:30:38)
- 4 (2009-03-02 (月) 13:57:36)
- 5 (2010-01-06 (水) 01:48:05)
- 6 (2011-03-12 (土) 19:37:07)
- 7 (2011-11-22 (火) 17:01:08)
- 8 (2012-06-17 (日) 15:29:52)
- 9 (2013-05-26 (日) 06:28:24)
- 10 (2013-07-26 (金) 19:21:46)
- 11 (2015-01-22 (木) 21:06:28)
- 12 (2015-06-22 (月) 17:59:14)
- 13 (2016-12-19 (月) 21:19:53)
- 14 (2017-12-08 (金) 16:10:53)
- 15 (2019-05-22 (水) 19:35:38)
- 16 (2019-08-28 (水) 19:47:37)
- 17 (2021-04-17 (土) 02:56:47)
TITLE:JTableのセル文字揃え
Posted by terai at 2008-08-25
JTableのセル文字揃え
JTableのセルに表示されている文字列の揃えを変更します。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
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);
}
}
}
解説
上記のサンプルでは、上部のラジオボタンで、第一列のセル文字列の揃えを変更することができます。
- left: 左揃え
- center: 中央揃え
- rihgt: 右揃え
- custom: 行ごとに左、中央、右揃えを変更
JTableは、Object、Number、Booleanクラスのデフォルトセルレンダラーを持っているため、モデル*1が各列のクラスを正しく返すように、TableModel#getColumnClass(int)をオーバーライドしてやると、そのクラスのデフォルトセルレンダラーが使用され*2、表示は数字右揃え、文字列左揃えになります。
- 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);
- テスト中
- ヘッダの字揃えを以下のように行った場合、フォントの指定は第二列のみ、字揃えは全体に作用する?
- Microsoft Windows XP [Version 5.1.2600]
- Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
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;
}
}