Swing/TableCellRenderer のバックアップの現在との差分(No.6)
JTableのセル幅で文字列を折り返し
編集者:Terai Atsuhiro~
作成日:2004-07-12
更新日:2023-12-14 (木) 10:20:14
概要
JTable
のセル幅に合わせて文字列を折り返します。
概要
JTableのセル幅に合わせて文字列を折り返します。Screenshot
Advertisement
サンプルコード
#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
**サンプルコード [#o9ff0afa]
#spanend
class MyJLabel extends JLabel {
private GlyphVector gvtext;
public MyJLabel() {super();}
protected void paintComponent(Graphics g) {
//super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
int WRAPPING_WIDTH = getWidth()-getInsets().left-getInsets().right;
FontRenderContext frc = g2.getFontRenderContext();
gvtext = getWrappedGlyphVector(getText(), WRAPPING_WIDTH, getFont(), frc);
g2.setPaint(getBackground());
g2.fillRect(0, 0, getWidth(), getHeight());
g2.setPaint(getForeground());
g2.drawGlyphVector(gvtext,
getInsets().left,
getFont().getSize()+getInsets().top);
}
private GlyphVector getWrappedGlyphVector(String str, float wrap,
Font font, FontRenderContext frc) {
Point2D gmPos = new Point2D.Double(0.0d, 0.0d);
GlyphVector gv = font.createGlyphVector(frc, str);
float lineheight = (float) (gv.getLogicalBounds().getHeight());
float xpos = 0.0f;
float advance = 0.0f;
int lineCount = 0;
GlyphMetrics gm;
for(int i=0;i<gv.getNumGlyphs();i++) {
gm = gv.getGlyphMetrics(i);
advance = gm.getAdvance();
if(xpos<wrap && wrap<=xpos+advance) {
lineCount++;
xpos = 0.0f;
}
gmPos.setLocation(xpos, lineheight*lineCount);
gv.setGlyphPosition(i, gmPos);
xpos = xpos + advance;
}
return gv;
}
}
class TestRenderer extends MyJLabel implements TableCellRenderer{
public TestRenderer() {
<以下省略>
@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));
}
-[[サンプルを起動>http://terai.xrea.jp/swing/tablecellrenderer/sample.jnlp]]
-[[jarファイル>http://terai.xrea.jp/swing/tablecellrenderer/sample.jar]]
-[[ソース>http://terai.xrea.jp/swing/tablecellrenderer/src.zip]]
#spandel
**解説 [#od38b372]
#spanend
#spandel
上記のサンプルでは、[[文字列の折り返し>Swing/GlyphVector]]で作成したラベルを継承するTableCellRendererを使って、セル幅に合わせて折り返しています。
#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());
}
// setHorizontalAlignment((value instanceof Number) ? RIGHT : LEFT);
setFont(table.getFont());
setText((value == null) ? "" : value.toString());
return this;
}
#spanadd
}
#spanend
#spandel
以下のようにsetLineWrap(true)としたJTextAreaを継承するTableCellRendererを使う方法などもあります。
#spanend
class MyCellRenderer extends JTextArea implements TableCellRenderer {
MyCellRenderer() {
super();
setLineWrap(true);
}
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
setText((value == null) ? "" : value.toString());
return this;
}
}
#spanadd
class MyJLabel extends JLabel {
#spanend
private GlyphVector gvtext;
public MyJLabel() {
super();
}
#spandel
//**参考リンク
#spanend
#spandel
**コメント [#v61c967e]
#spanend
@Override protected void paintComponent(Graphics g) {
// super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// ...
g2.drawGlyphVector(gvtext,
getInsets().left,
getFont().getSize()+getInsets().top);
}
// ...
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlin解説
-
0
列目- デフォルトの
JLabel
を継承するDefaultTableCellRenderer
を使用し超過分は...
で省略
- デフォルトの
-
1
列目- 文字列の折り返しで作成した
JLabel
を継承するレンダラーを使ってセル幅に合わせて折り返し
- 文字列の折り返しで作成した
-
2
列目-
JTextArea
を継承するTableCellRenderer
を作成しJTextArea#setLineWrap(boolean)
メソッドを使用して折り返しを有効化
-
参考リンク
- TableCellRendererでセルの背景色を変更
- JTableのセルの高さを自動調整
- セル幅だけでなく高さも調整する方法のサンプル