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

#contents

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

#screenshot

**サンプルコード [#o9ff0afa]
#code{{
 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);
   }
   ......
 }
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#od38b372]
- 1列目
-- [[文字列の折り返し>Swing/GlyphVector]]で作成したJLabelを継承するレンダラーを使って、セル幅に合わせて折り返しています。

- 2列目
-- JTextAreaを継承するTableCellRendererを作成し、このレンダラーをJTextArea#setLineWrap(boolean)メソッドを使って折り返しを有効にしています。
//((%%日本語の折り返しが少しずれる場合がある?%%))。

**参考リンク [#k6d1f8d5]
-[[TableCellRendererでセルの背景色を変更>Swing/StripeTable]]

**コメント [#v61c967e]
#comment