• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableのセル幅で文字列を折り返し
#navi(../)
RIGHT:Posted by [[terai]] at 2004-07-12
*JTableのセル幅で文字列を折り返し [#o1225d3b]
JTableのセル幅に合わせて文字列を折り返します。
---
category: swing
folder: TableCellRenderer
title: JTableのセル幅で文字列を折り返し
tags: [JTable, TableCellRenderer, JTextArea, JLabel]
author: aterai
pubdate: 2004-07-12T03:26:48+09:00
description: JTableのセル幅に合わせて文字列を折り返します。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTUbGVPssI/AAAAAAAAAmA/dPiTKpwf1Ro/s800/TableCellRenderer.png
---
* 概要 [#summary]
`JTable`のセル幅に合わせて文字列を折り返します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTUbGVPssI/AAAAAAAAAmA/dPiTKpwf1Ro/s800/TableCellRenderer.png)

#screenshot

**サンプルコード [#o9ff0afa]
#code{{
* サンプルコード [#sourcecode]
#code(link){{
TableColumnModel tcm = table.getColumnModel();
tcm.getColumn(1).setCellRenderer(new TestRenderer());
tcm.getColumn(2).setCellRenderer(new TextAreaCellRenderer());
}}
#code{{
// ...
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) {

  @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{
    } else {
      setForeground(table.getForeground());
      setBackground(table.getBackground());
    }
    setText((value == null) ? "" : value.toString());
    return this;
  }
}
}}
#code{{
// ...
class TestRenderer extends MyJLabel implements TableCellRenderer {
  public TestRenderer() {
    super();
    setOpaque(true);
    setBorder(BorderFactory.createEmptyBorder(0,5,0,5));
    setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
  }
  public Component getTableCellRendererComponent(JTable table, Object value,
                                       boolean isSelected, boolean hasFocus,
                                       int row, int column) {
    if(isSelected) {

  @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{
    } else {
      setForeground(table.getForeground());
      setBackground(table.getBackground());
    }
    //setHorizontalAlignment((value instanceof Number)?RIGHT:LEFT);
    // 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;
    //......
  public MyJLabel() {
    super();
  }

  @Override protected void paintComponent(Graphics g) {
    // super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    // ...
    g2.drawGlyphVector(gvtext,
                       getInsets().left,
                       getFont().getSize()+getInsets().top);
  }
  //......
  // ...
}
}}

**解説 [#od38b372]
- 1列目
-- [[文字列の折り返し>Swing/GlyphVector]]で作成したJLabelを継承するレンダラーを使って、セル幅に合わせて折り返しています。
* 解説 [#explanation]
- `0`列目
-- デフォルトの`JLabel`を継承する`DefaultTableCellRenderer`を使用し超過分は`...`で省略
- `1`列目
-- [[文字列の折り返し>Swing/GlyphVector]]で作成した`JLabel`を継承するレンダラーを使ってセル幅に合わせて折り返し
- `2`列目
-- `JTextArea`を継承する`TableCellRenderer`を作成し`JTextArea#setLineWrap(boolean)`メソッドを使用して折り返しを有効化

- 2列目
-- JTextAreaを継承するTableCellRendererを作成し、このレンダラーをJTextArea#setLineWrap(boolean)メソッドを使って折り返しを有効にしています。
//((%%日本語の折り返しが少しずれる場合がある?%%))。
* 参考リンク [#reference]
- [[TableCellRendererでセルの背景色を変更>Swing/StripeTable]]
- [[JTableのセルの高さを自動調整>Swing/AutoWrapTableCell]]
-- セル幅だけでなく高さも調整する方法のサンプル

**参考リンク [#k6d1f8d5]
-[[TableCellRendererでセルの背景色を変更>Swing/StripeTable]]
-[[JTableのセルの高さを自動調整>Swing/AutoWrapTableCell]]
* コメント [#comment]
#comment
- メモ: `TextAreaCellRenderer`を、`NimbusLookAndFeel`で使ったとき、うまく余白を消す方法が分からない。 -- &user(aterai); &new{2008-05-08 (木) 18:25:18};
- ここの方法だと行の高さも自動変更してくれます。%%This JDK Tutorial shows you how to wrap text inside cells of a JTable%% (リンク切れ) -- &user(とおりすがり); &new{2010-12-10 (金) 10:12:40};
- ご指摘ありがとうございます。この方法なら、[[JTableのセルの高さを自動調整>Swing/AutoWrapTableCell]]で発生しているバグも修正できそうです。 -- &user(aterai); &new{2010-12-10 (金) 13:50:58};
-- スクロールバーの表示・非表示が繰り返されるバグは修正できそうだけど、高さが更新されない場合がある(上記の`www.roseindia.net`にある例だと、列幅をすこしずつ調整すると、`fox`が表示されなくなる)方は難しそう? -- &user(aterai); &new{2010-12-10 (金) 17:43:28};

**コメント [#v61c967e]
- メモ: TextAreaCellRendererを、NimbusLookAndFeel で使ったとき、うまく余白を消す方法が分からない。 -- [[terai]] &new{2008-05-08 (木) 18:25:18};
- ここの方法だと行の高さも自動変更してくれます。ttp://www.roseindia.net/javatutorials/JTable_in_JDK.shtml -- [[とおりすがり]] &new{2010-12-10 (金) 10:12:40};

#comment