Swing/TableCellRenderer のバックアップ(No.18)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TableCellRenderer へ行く。
- 1 (2004-10-08 (金) 06:26:51)
- 2 (2004-11-04 (木) 10:12:36)
- 3 (2005-04-28 (木) 04:33:10)
- 4 (2005-06-16 (木) 03:14:48)
- 5 (2005-07-05 (火) 22:10:07)
- 6 (2005-09-21 (水) 21:54:39)
- 7 (2006-02-27 (月) 16:56:25)
- 8 (2006-06-22 (木) 17:20:47)
- 9 (2006-11-10 (金) 03:38:35)
- 10 (2007-03-13 (火) 19:47:04)
- 11 (2007-03-15 (木) 14:21:24)
- 12 (2007-05-17 (木) 18:06:02)
- 13 (2008-02-14 (木) 14:14:38)
- 14 (2008-05-08 (木) 18:25:18)
- 15 (2010-10-25 (月) 14:23:41)
- 16 (2010-12-10 (金) 10:12:40)
- 17 (2010-12-10 (金) 13:50:58)
- 18 (2010-12-10 (金) 17:43:28)
- 19 (2011-04-26 (火) 14:14:05)
- 20 (2013-04-10 (水) 16:08:52)
- 21 (2014-11-22 (土) 03:59:58)
- 22 (2015-01-07 (水) 16:17:40)
- 23 (2015-01-13 (火) 11:19:07)
- 24 (2016-07-19 (火) 22:24:33)
- 25 (2016-09-02 (金) 12:11:11)
- 26 (2017-10-12 (木) 13:39:11)
- 27 (2019-04-09 (火) 15:48:24)
- 28 (2021-01-23 (土) 21:36:28)
- 29 (2023-12-14 (木) 10:20:14)
TITLE:JTableのセル幅で文字列を折り返し
Posted by terai at 2004-07-12
JTableのセル幅で文字列を折り返し
JTableのセル幅に合わせて文字列を折り返します。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
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
- ここの方法だと行の高さも自動変更してくれます。ttp://www.roseindia.net/javatutorials/JTable_in_JDK.shtml -- とおりすがり?
- ご指摘ありがとうございます。この方法なら、JTableのセルの高さを自動調整で発生しているバグも修正できそうです。 -- terai