Swing/TableCellRenderer のバックアップの現在との差分(No.12)
TITLE:JTableのセル幅で文字列を折り返し
JTableのセル幅で文字列を折り返し
編集者:Terai Atsuhiro~
作成日:2004-07-12
更新日:2023-12-14 (木) 10:20:14
概要
JTable
のセル幅に合わせて文字列を折り返します。
Screenshot
Advertisement
概要
JTableのセル幅に合わせて文字列を折り返します。サンプルコード
#spanend
#spanadd
TableColumnModel tcm = table.getColumnModel();
#spanend
#spanadd
tcm.getColumn(1).setCellRenderer(new TestRenderer());
#spanend
#spanadd
tcm.getColumn(2).setCellRenderer(new TextAreaCellRenderer());
#spanend
#spanadd
// ...
#spanend
#spanadd
class TextAreaCellRenderer extends JTextArea implements TableCellRenderer {
#spanend
TextAreaCellRenderer() {
super();
setLineWrap(true);
}
#spandel
#screenshot
#spanend
@Override 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;
}
#spanadd
}
#spanend
#spanadd
// ...
#spanend
#spanadd
class TestRenderer extends MyJLabel implements TableCellRenderer {
#spanend
public TestRenderer() {
super();
setOpaque(true);
setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
}
#spandel
**サンプルコード [#o9ff0afa]
#spanend
#spandel
#code{{
#spanend
TableColumnModel tcm = table.getColumnModel();
tcm.getColumn(1).setCellRenderer(new TestRenderer());
tcm.getColumn(2).setCellRenderer(new TextAreaCellRenderer());
@Override 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;
}
#spanadd
}
#spanend
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;
}
}
#spanadd
class MyJLabel extends JLabel {
#spanend
private GlyphVector gvtext;
public MyJLabel() {
super();
}
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);
}
......
}
@Override protected void paintComponent(Graphics g) {
// super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// ...
g2.drawGlyphVector(gvtext,
getInsets().left,
getFont().getSize()+getInsets().top);
}
// ...
#spanadd
}
#spanend
View in GitHub: Java, Kotlin- &jnlp;
- &jar;
- &zip;
解説
- 1列目
- 文字列の折り返しで作成したJLabelを継承するレンダラーを使って、セル幅に合わせて折り返しています。
解説
-
0
列目- デフォルトの
JLabel
を継承するDefaultTableCellRenderer
を使用し超過分は...
で省略
- デフォルトの
-
1
列目- 文字列の折り返しで作成した
JLabel
を継承するレンダラーを使ってセル幅に合わせて折り返し
- 文字列の折り返しで作成した
-
2
列目-
JTextArea
を継承するTableCellRenderer
を作成しJTextArea#setLineWrap(boolean)
メソッドを使用して折り返しを有効化
-
- 2列目
- JTextAreaを継承するTableCellRendererを作成し、このレンダラーをJTextArea#setLineWrap(boolean)メソッドを使って折り返しを有効にしています。
参考リンク
- TableCellRendererでセルの背景色を変更
- JTableのセルの高さを自動調整
- セル幅だけでなく高さも調整する方法のサンプル
参考リンク
コメント
- メモ:
TextAreaCellRenderer
を、NimbusLookAndFeel
で使ったとき、うまく余白を消す方法が分からない。 -- aterai - ここの方法だと行の高さも自動変更してくれます。
This JDK Tutorial shows you how to wrap text inside cells of a JTable(リンク切れ) -- とおりすがり - ご指摘ありがとうございます。この方法なら、JTableのセルの高さを自動調整で発生しているバグも修正できそうです。 -- aterai
- スクロールバーの表示・非表示が繰り返されるバグは修正できそうだけど、高さが更新されない場合がある(上記の
www.roseindia.net
にある例だと、列幅をすこしずつ調整すると、fox
が表示されなくなる)方は難しそう? -- aterai
- スクロールバーの表示・非表示が繰り返されるバグは修正できそうだけど、高さが更新されない場合がある(上記の