TITLE:JTableのセル幅で文字列を折り返し
#navi(../)
*JTableのセル幅で文字列を折り返し [#o1225d3b]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2004-07-12~
更新日:&lastmod;

#contents

**概要 [#v8d78438]
JTableのセル幅に合わせて文字列を折り返します。

#screenshot

**サンプルコード [#o9ff0afa]
 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() {
   <以下省略>

-&jnlp;
-&jar;
-&zip;

**解説 [#od38b372]
上記のサンプルでは、[[文字列の折り返し>Swing/GlyphVector]]で作成したラベルを継承するTableCellRendererを使って、セル幅に合わせて折り返しています。

以下のようにJTextArea#setLineWrap(true)としたJTextAreaを継承するTableCellRendererを使う方法もあります。
 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;
   }
 }

//**参考リンク
**コメント [#v61c967e]
#comment