Posted by terai at 2004-07-12
JTableのセル幅で文字列を折り返し
JTableのセル幅に合わせて文字列を折り返します。
サンプルコード
TableColumnModel tcm = table.getColumnModel(); tcm.getColumn(1).setCellRenderer(new TestRenderer()); tcm.getColumn(2).setCellRenderer(new TextAreaCellRenderer());
class TextAreaCellRenderer extends JTextArea implements TableCellRenderer {
TextAreaCellRenderer() {
super();
setLineWrap(true);
}
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
if(isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
}else{
setForeground(table.getForeground());
setBackground(table.getBackground());
}
setText((value == null) ? "" : value.toString());
return this;
}
}
class TestRenderer extends MyJLabel implements TableCellRenderer {
public TestRenderer() {
super();
setOpaque(true);
setBorder(BorderFactory.createEmptyBorder(0,5,0,5));
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
if(isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
}else{
setForeground(table.getForeground());
setBackground(table.getBackground());
}
//setHorizontalAlignment((value instanceof Number)?RIGHT:LEFT);
setFont(table.getFont());
setText((value == null) ? "" : value.toString());
return this;
}
}
class MyJLabel extends JLabel {
private GlyphVector gvtext;
public MyJLabel() {super();}
protected void paintComponent(Graphics g) {
//super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
//......
g2.drawGlyphVector(gvtext,
getInsets().left,
getFont().getSize()+getInsets().top);
}
//......
}
解説
- 1列目
- 文字列の折り返しで作成したJLabelを継承するレンダラーを使って、セル幅に合わせて折り返しています。
- 2列目
- JTextAreaを継承するTableCellRendererを作成し、このレンダラーをJTextArea#setLineWrap(boolean)メソッドを使って折り返しを有効にしています。
参考リンク
コメント
- メモ: TextAreaCellRendererを、NimbusLookAndFeel で使ったとき、うまく余白を消す方法が分からない。 -- terai 2008-05-08 (木) 18:25:18