2009-06-08 39 views
31

私はthis tutorialで説明されているように、カスタムTableRendererを実装しようとしています。 レンダラーは、指定されたセルの長さになる各テキストを行折り返しにしたいと思っています。 考え方は、TextAreaをレンダラーとして使用することです。ラインラッピングをサポートしているからです。ただし、次のコードは、期待どおりに動作しません:私はjtableセルの行を折り返す方法は?

table.setDefaultRenderer(String.class, new LineWrapCellRenderer()); 

でこのレンダラーを設定する。しかし、セルのエントリが開封された滞在

public class LineWrapCellRenderer extends JTextArea implements TableCellRenderer { 

    @Override 
    public Component getTableCellRendererComponent(
      JTable table, 
      Object value, 
      boolean isSelected, 
      boolean hasFocus, 
      int row, 
      int column) { 
     this.setText((String)value); 
     this.setWrapStyleWord(true);    
     this.setLineWrap(true);   
     return this; 
    } 

} 

getTableCellRendererComponent()メソッドにthis.setBackground(Color.YELLOW)を追加すると、 すべてのセルが予想どおり黄色ですが、ラップされません。

アイデア?

UPDATE:マイケルBorgwardtはコメントで述べたように、問題は、行の折り返しが、行の高さではありません。JTables行が固定されているサイズなので、電池が高くなっている場合(テキストは今マルチである原因)、行の高さを増やす必要があります。 どれくらいですか?これが別のSO質問の価値があるかどうかを確認します。そうでない場合、私はこの解決方法をここに追加します。

アップデート2:getTableCellRendererComponent()に配置されている場合)、次のコードは、行の高さを決定します:あなたはレンダラとしてのJLabelを使用して、HTMLタグにテキストを挿入し、ちょうど<br>を追加することができ

int fontHeight = this.getFontMetrics(this.getFont()).getHeight(); 
int textLength = this.getText().length(); 
int lines = textLength/this.getColumns() +1;//+1, cause we need at least 1 row.   
int height = fontHeight * lines;    
table.setRowHeight(row, height); 
+3

レンダラーのテーブルの状態を変更しないでください。** never-ever **のように** – kleopatra

+15

親愛なるクレオパトラ!私たちに、これをより良くすることができるというだけでなく、解決策を教えてください。 –

+0

これを確認してくださいhttp://stackoverflow.com/questions/33937074/jtable-cell-wrapping/38932843#38932843 – Yougesh

答えて

11

適切なs;なぜそれがどういうわけかは分かりませんが、もしそれができたら、ラップされたテキストが切り取られるでしょう - それはまさにあなたが見ているものです。行の高さを調整するには、行の高さを個別に設定する必要があります。

+0

それは問題であるようです。行の高さをより大きな値に設定すると、行の折り返しが表示されます。今問題:完全な新しい高さを得る方法。 – Arvodan

+0

私はリンク先の記事を見てください。それは、完全に機能するソリューションに簡単に適応できるサンプルコードを持っています。 –

+9

あなたはもうこれ以上働かないことをお勧めします...実際にここにコードを表示することを支持する議論でしょうか? –

2

それはラップレンダラを持つだけの問題ではありませんので、問題は、JTableの行の高さは、固定されていることをどこ

How to use HTML in Swing Components

+0

注意:DefaultTableCellRendererはすでにJLabelです。 – Joey

+0

私は知っていますが、自分でHTMLのものを追加する必要があります... – willcodejavaforfood

6

こんにちは私は同じ問題を抱えていましたが、私が実装したソリューションは、Java Tutorialから複数行のテキストを描画するサンプルからインスピレーションを得て、テキストAPIを使用してセル上にテキストを描画します。

http://java.sun.com/docs/books/tutorial/2d/text/drawmulstring.html

import java.awt.Component; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.font.FontRenderContext; 
import java.awt.font.LineBreakMeasurer; 
import java.awt.font.TextLayout; 
import java.text.AttributedCharacterIterator; 
import java.text.AttributedString; 
import java.text.BreakIterator; 

import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.TableCellRenderer; 


public class MultilineTableCell 
    implements TableCellRenderer { 
    class CellArea extends DefaultTableCellRenderer { 
     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 
     private String text; 
     protected int rowIndex; 
     protected int columnIndex; 
     protected JTable table; 
     protected Font font; 
     private int paragraphStart,paragraphEnd; 
     private LineBreakMeasurer lineMeasurer; 

     public CellArea(String s, JTable tab, int row, int column,boolean isSelected) { 
      text = s; 
      rowIndex = row; 
      columnIndex = column; 
      table = tab; 
      font = table.getFont(); 
      if (isSelected) { 
       setForeground(table.getSelectionForeground()); 
       setBackground(table.getSelectionBackground()); 
      } 
     } 
     public void paintComponent(Graphics gr) { 
      super.paintComponent(gr); 
      if (text != null && !text.isEmpty()) { 
       Graphics2D g = (Graphics2D) gr; 
       if (lineMeasurer == null) { 
        AttributedCharacterIterator paragraph = new AttributedString(text).getIterator(); 
        paragraphStart = paragraph.getBeginIndex(); 
        paragraphEnd = paragraph.getEndIndex(); 
        FontRenderContext frc = g.getFontRenderContext(); 
        lineMeasurer = new LineBreakMeasurer(paragraph,BreakIterator.getWordInstance(), frc); 
       } 
       float breakWidth = (float)table.getColumnModel().getColumn(columnIndex).getWidth(); 
       float drawPosY = 0; 
       // Set position to the index of the first character in the paragraph. 
       lineMeasurer.setPosition(paragraphStart); 
       // Get lines until the entire paragraph has been displayed. 
       while (lineMeasurer.getPosition() < paragraphEnd) { 
        // Retrieve next layout. A cleverer program would also cache 
        // these layouts until the component is re-sized. 
        TextLayout layout = lineMeasurer.nextLayout(breakWidth); 
        // Compute pen x position. If the paragraph is right-to-left we 
        // will align the TextLayouts to the right edge of the panel. 
        // Note: this won't occur for the English text in this sample. 
        // Note: drawPosX is always where the LEFT of the text is placed. 
        float drawPosX = layout.isLeftToRight() 
         ? 0 : breakWidth - layout.getAdvance(); 
        // Move y-coordinate by the ascent of the layout. 
        drawPosY += layout.getAscent(); 
        // Draw the TextLayout at (drawPosX, drawPosY). 
        layout.draw(g, drawPosX, drawPosY); 
        // Move y-coordinate in preparation for next layout. 
        drawPosY += layout.getDescent() + layout.getLeading(); 
       } 
       table.setRowHeight(rowIndex,(int) drawPosY); 
      } 
     } 
    } 
    public Component getTableCellRendererComponent(
      JTable table, Object value,boolean isSelected, boolean hasFocus, int row,int column 
     ) 
    { 
     CellArea area = new CellArea(value.toString(),table,row,column,isSelected); 
     return area; 
    } 
} 

あまりにも行heigthのサイズを変更しますが、このレンダリングは、単一の列のために使用される場合、それはうまくのみありません。

これは私がテーブルをレンダーするために使用した方法です。

final int wordWrapColumnIndex = ...; 
myTable = new JTable() {  
    public TableCellRenderer getCellRenderer(int row, int column) { 
     if (column == wordWrapColumnIndex) { 
      return wordWrapRenderer; 
     } 
     else { 
      return super.getCellRenderer(row, column); 
     } 
    } 
}; 
+0

私のプログラムでこのコードを使用したいと思います。もし私が許すなら、どのライセンスの下にこのコードを含めるべきですか? –

+0

このコードの大部分は、パブリックドメインのチュートリアルであり、ライセンスポリシーを妨げるべきではありません。 –

+0

-1テーブルの状態を変更するには...ペイントメソッド?それはgetXXRendererCompでこれを行うよりもさらに悪いことです。これはすでに絶対的なものではありません。そして、他のものはありません。各呼び出しで新しいコンポーネントを作成し、サイジングのヒントを実装しないでください。 ) – kleopatra

0

ヘッダーをHTMLで記述します。ここに私が持っている例があります。私が経験している唯一の問題は、ヘッダーの高さを調整すると、JPanelにスクロールさせるのが苦労していることです。

myTable.getColumnModel().getColumn(1).setPreferredWidth(75); 
    myTable.getColumnModel().getColumn(1).setHeaderValue("<html><b>Day Of<br>Week</b></html>"); 
+3

質問はヘッダーに関するものではありません... – kleopatra

0

レンダラコンポーネントの使用setBounds(下記参照)

import java.awt.*; 
import java.io.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.table.*; 

public class MultiWrapColDemo { 
    public static void main(String[] args) throws FileNotFoundException { 
    EventQueue.invokeLater(new ShowIt()); 
    } 
} 

class ShowIt implements Runnable { 
    @Override 
    public void run() { 
    JTable table = new JTable(); 
    table.getColumnModel().addColumnModelListener(new WrapColListener(table)); 
    table.setDefaultRenderer(Object.class, new JTPRenderer()); 

    // examples: 
// table.setIntercellSpacing(new Dimension(40, 20)); 
// table.setIntercellSpacing(new Dimension(4, 2)); 

    Vector<Vector<String>> dataVector = new Vector<Vector<String>>(); 
    String lorem1 = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore"; 
    String lorem2 = "et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum"; 

    for (int i = 0; i < 12; i++) { 
     Vector<String> row = null; 
     if (i % 4 == 0) { 
     row = new Vector<String>(Arrays.asList(new String[] { "iggle", lorem1, "poggle", "poke" })); 
     } else if (i % 4 == 1) { 
     row = new Vector<String>(Arrays.asList(new String[] { lorem2, "piggle", "poggle", lorem1 })); 
     } else if (i % 4 == 2) { 
     row = new Vector<String>(Arrays.asList(new String[] { lorem1, "piggle", lorem2, "poke" })); 
     } else 
     row = new Vector<String>(Arrays.asList(new String[] { "iggle", lorem2, "poggle", lorem2 })); 
     dataVector.add(row); 
    } 
    Vector<String> columnIdentifiers = new Vector<String>(Arrays.asList(new String[] { "iggle", "piggle", "poggle", 
     "poke" })); 
    table.getTableHeader().setFont(table.getTableHeader().getFont().deriveFont(20f).deriveFont(Font.BOLD)); 
    ((DefaultTableModel) table.getModel()).setDataVector(dataVector, columnIdentifiers); 
    JFrame frame = new JFrame("MultiWrapColTable"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JScrollPane jsp = new JScrollPane(table); 
    frame.getContentPane().add(jsp); 
    frame.pack(); 
    frame.setBounds(50, 50, 800, 500); 
    frame.setVisible(true); 
    } 
} 


// if the renderer on a column (or the whole table) is not a JTextComponent calculating its preferredSize will not do 
// any wrapping ... but it won't do any harm.... 
class JTPRenderer extends JTextPane implements TableCellRenderer { 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 
     int row, int column) { 
    setText(value.toString()); 
    return this; 
    } 
} 

class WrapColListener implements TableColumnModelListener { 

    JTable m_table; 

    WrapColListener(JTable table){ 
    m_table = table; 
    } 

    void refresh_row_heights() { 
    int n_rows = m_table.getRowCount(); 
    int n_cols = m_table.getColumnCount(); 
    int intercell_width = m_table.getIntercellSpacing().width; 
    int intercell_height = m_table.getIntercellSpacing().height; 
    TableColumnModel col_model = m_table.getColumnModel(); 
    // these null checks are due to concurrency considerations... much can change between the col margin change 
    // event and the call to refresh_row_heights (although not in this SSCCE...) 
    if(col_model == null) return; 
    // go through ALL rows, calculating row heights 
    for (int row = 0; row < n_rows; row++) { 
     int pref_row_height = 1; 
     // calculate row heights from cell, setting width constraint by means of setBounds... 
     for (int col = 0; col < n_cols; col++) { 
     Object value = m_table.getValueAt(row, col); 
     TableCellRenderer renderer = m_table.getCellRenderer(row, col); 
     if(renderer == null) return; 
     Component comp = renderer.getTableCellRendererComponent(m_table, value, false, false, 
      row, col); 
     if(comp == null) return; 
     int col_width = col_model.getColumn(col).getWidth(); 
     // constrain width of component 
     comp.setBounds(new Rectangle(0, 0, col_width - intercell_width, Integer.MAX_VALUE)); 
     // getPreferredSize then returns "true" height as a function of attributes (e.g. font) and word-wrapping 
     int pref_cell_height = comp.getPreferredSize().height + intercell_height; 
     if (pref_cell_height > pref_row_height) { 
      pref_row_height = pref_cell_height; 
     } 
     } 
     if (pref_row_height != m_table.getRowHeight(row)) { 
     m_table.setRowHeight(row, pref_row_height); 
     } 
    } 
    } 

    @Override 
    public void columnAdded(TableColumnModelEvent e) { 
    refresh_row_heights(); 

    } 

    @Override 
    public void columnRemoved(TableColumnModelEvent e) { 
    // probably no need to call refresh_row_heights 

    } 

    @Override 
    public void columnMoved(TableColumnModelEvent e) { 
    // probably no need to call refresh_row_heights 

    } 

    @Override 
    public void columnMarginChanged(ChangeEvent e) { 
    refresh_row_heights(); 
    } 

    @Override 
    public void columnSelectionChanged(ListSelectionEvent e) { 
    // probably no need to call refresh_row_heights 

    } 

} 

このSSCCEで罰金以上の作品...現実の世界では、より複雑なフォント、より多くのテキスト、より大きなテーブルでは、問題にぶつかり始めます。したがって、私は以下のListenerクラスの新しいバージョンと、新しいバージョンのレンダラーを提案します(ちょうど複雑なフォントの使用を紹介する...)。興味があれば、上記SSCCEにこれらを代入...

/* 
* This class reflects the fact that 1) when you drag a column boundary using the mouse a very large number of 
* ChangeEvents are generated and 2) with more complex fonts, more text and larger tables ("real world") the amount 
* of computation in calculating the row heights becomes significant and leads to an unresponsive GUI, or worse. 
* This "first" strategy to address this involves setting a pause between the detection of a change event and the 
* refreshing of the rows. Naturally this involves a Timer, the run() method of which is not the EDT, so it 
* must then submit to EventQueue.invokeLater... 
* The larger the table, the more text involved, and the more complex the fonts... the more ingenuity will have to 
* be used in coping with the potentially vast amount of computation involved in getting the ideal row heights. This 
* is in the nature of the beast. Ideas might involve: 
* 1) adjusting the row heights immediately only for rows which are visible or likely to be visible (Viewport), and 
* then making successive calls to EventQueue.invokeLater to deal with all the other rows 
* 2) giving cells a "memory" of their heights as a function of the allowed width. Unfortunately it will not allow 
* the possibility of interpolating intermediate values because the question of whether a line wraps may hinge on a 
* single pixel difference, although an imperfect solution to this would be err on the side of caution, i.e. pretend 
* that a column is a little thinner than it is to cause wrapping before it is strictly necessary... particularly when 
* cells are out of view... 
* ... other ideas...(?) 
*/ 
class FirstRealWorldWrapColListener implements TableColumnModelListener { 

    JTable m_table; 
    final static long PAUSE_TIME = 50L; 
    java.util.Timer m_pause_timer = new java.util.Timer("pause timer", true); 
    TimerTask m_pause_task; 

    class PauseTask extends TimerTask{ 
    @Override 
    public void run() { 
     EventQueue.invokeLater(new Runnable(){ 
     @Override 
     public void run() { 
      refresh_row_heights(); 
      System.out.println("=== setting m_pause_task to null..."); 
      m_pause_task = null; 
     }}); 
    } 
    } 

    FirstRealWorldWrapColListener(JTable table){ 
    m_table = table; 
    } 


    void queue_refresh(){ 
    if(m_pause_task != null){ 
     return; 
    } 
    System.out.println("=== scheduling..."); 
    m_pause_task = new PauseTask(); 
    m_pause_timer.schedule(m_pause_task, PAUSE_TIME); 

    } 

    void refresh_row_heights() { 

    int n_rows = m_table.getRowCount(); 
    int n_cols = m_table.getColumnCount(); 
    int intercell_width = m_table.getIntercellSpacing().width; 
    int intercell_height = m_table.getIntercellSpacing().height; 
    TableColumnModel col_model = m_table.getColumnModel(); 
    // these null checks are due to concurrency considerations... much can change between the col margin change 
    // event and the call to refresh_row_heights (although not in this SSCCE...) 
    if(col_model == null) return; 
    // go through ALL rows, calculating row heights 
    for (int row = 0; row < n_rows; row++) { 
     int pref_row_height = 1; 
     // calculate row heights from cell, setting width constraint by means of setBounds... 
     for (int col = 0; col < n_cols; col++) { 
     Object value = m_table.getValueAt(row, col); 
     TableCellRenderer renderer = m_table.getCellRenderer(row, col); 
     if(renderer == null) return; 
     Component comp = renderer.getTableCellRendererComponent(m_table, value, false, false, 
      row, col); 
     if(comp == null) return; 
     int col_width = col_model.getColumn(col).getWidth(); 
     // constrain width of component 
     comp.setBounds(new Rectangle(0, 0, col_width - intercell_width, Integer.MAX_VALUE)); 
     // getPreferredSize then returns "true" height as a function of attributes (e.g. font) and word-wrapping 
     int pref_cell_height = comp.getPreferredSize().height + intercell_height; 
     if (pref_cell_height > pref_row_height) { 
      pref_row_height = pref_cell_height; 
     } 
     } 
     if (pref_row_height != m_table.getRowHeight(row)) { 
     m_table.setRowHeight(row, pref_row_height); 
     } 
    } 
    } 

    @Override 
    public void columnAdded(TableColumnModelEvent e) { 
// refresh_row_heights(); 
    queue_refresh(); 

    } 

    @Override 
    public void columnRemoved(TableColumnModelEvent e) { 
    // probably no need to call refresh_row_heights 

    } 

    @Override 
    public void columnMoved(TableColumnModelEvent e) { 
    // probably no need to call refresh_row_heights 

    } 

    @Override 
    public void columnMarginChanged(ChangeEvent e) { 
// refresh_row_heights(); 
    queue_refresh(); 
    } 

    @Override 
    public void columnSelectionChanged(ListSelectionEvent e) { 
    // probably no need to call refresh_row_heights 

    } 

} 

// if the renderer on a column (or the whole table) is not a JTextComponent calculating its preferredSize will not do 
// any wrapping ... but it won't do any harm.... 
class JTPRenderer extends JTextPane implements TableCellRenderer { 
    Font m_default_font, m_big_font, m_default_alternate_font, m_big_alternate_font; 
    HashMap<AttributedCharacterIterator.Attribute, Object> m_red_serif_attr_map; 
    // 
    JTPRenderer() { 
    m_default_font = getFont(); 
    m_big_font = m_default_font.deriveFont(m_default_font.getSize() * 1.5f); 
    m_red_serif_attr_map = new HashMap<AttributedCharacterIterator.Attribute, Object >(); 
    m_red_serif_attr_map.put(TextAttribute.FAMILY, Font.SERIF); 
    m_red_serif_attr_map.put(TextAttribute.FOREGROUND, Color.RED); 
    m_red_serif_attr_map.put(TextAttribute.WIDTH, TextAttribute.WIDTH_EXTENDED); 
    m_default_alternate_font = m_default_font.deriveFont(m_red_serif_attr_map); 
    m_big_alternate_font = m_big_font.deriveFont(m_red_serif_attr_map); 
    // simpler alternate font: 
// m_default_alternate_font = m_default_font.deriveFont(Font.BOLD | Font.ITALIC); 
// m_big_alternate_font = m_big_font.deriveFont(Font.BOLD | Font.ITALIC); 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 
     int row, int column) { 
    int rc = row + column; 
    if(rc % 4 == 2) 
     setFont(rc % 5 == 1 ? m_big_alternate_font : m_default_alternate_font); 
    else 
     setFont(rc % 5 == 1 ? m_big_font : m_default_font); 
    setText(value.toString()); 
    return this; 
    } 

} 
0

行の高さ上述したように計算することが、現在のソリューションを向上させることができる必要があります。実際、それは私のために働いていなかった。 jtxt.getColumns()が0を返していたため、0で除算されました。私はクリーナーだと思ういくつかのコードは次のとおりです。

// set the width on the jTextArea causing a calc of preferred height 
jtxt.setSize(table.getWidth(), Short.MAX_VALUE); 
int prefH = jtxt.getPreferredSize().height; 
table.setRowHeight(row, prefH); 
3

この質問に加えて、私はあなたと複数のセルエディタのソリューションを共有したいと思います。これはちょっとハッキーです(編集された行への参照を保存します)。ように使用される

import javax.swing.*; 
import javax.swing.table.TableCellEditor; 
import java.awt.*; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

class MultilineTableCellEditor extends AbstractCellEditor implements TableCellEditor { 

    JComponent component = new JTextArea(); 
    JTable table; 
    int lastRowIndex; 

    public MultilineTableCellEditor() { 
     JTextArea textArea = ((JTextArea) component); 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 
     textArea.addComponentListener(new ComponentAdapter() { 
      @Override 
      public void componentResized(ComponentEvent e) { 
       super.componentResized(e); 
       table.setRowHeight(lastRowIndex, (int) (textArea.getPreferredSize().getHeight())); 
      } 
     }); 
     textArea.addKeyListener(new KeyAdapter() { 
      @Override 
      public void keyTyped(KeyEvent e) { 
       super.keyTyped(e); 
       table.setRowHeight(lastRowIndex, (int) (textArea.getPreferredSize().getHeight())); 
      } 
     }); 
    } 

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, 
               int rowIndex, int vColIndex) { 
     this.table = table; 
     lastRowIndex = rowIndex; 

     ((JTextArea) component).setText((String) value); 
     component.setFont(table.getFont()); 

     return component; 
    } 

    public Object getCellEditorValue() { 
     return ((JTextArea) component).getText(); 
    } 
} 

JTable table = new JTable(tableModel) { 
     // Cell renderer by Alessandro Rossi (posted as solution to this question) 
     MultilineTableCell renderer = new MultilineTableCell(); 
     MultilineTableCellEditor editor = new MultilineTableCellEditor(); 

     @Override 
     public TableCellRenderer getCellRenderer(int row, int column) { 
      if (column == multilineColumn) { 
       return renderer; 
      } 
      return super.getCellRenderer(row, column); 
     } 

     @Override 
     public TableCellEditor getCellEditor(int row, int column) { 
      if (column == multilineColumn) { 
       return editor; 
      } 
      return super.getCellEditor(row, column); 
     } 
    }; 
+0

+1私は数週間エディター用のラインラッパーを探していましたが、最終的にこれが見つかりました。ありがとうございました! – ppw

1

私はこの同じ問題につまずいた、と私はそれがここに書かれたコードを少し変更するために必要なので、私は私自身のバージョン添付:

import java.awt.Component; 
import javax.swing.JTable; 
import javax.swing.JTextArea; 
import javax.swing.table.TableCellRenderer; 

public class LineWrapCellRenderer extends JTextArea implements TableCellRenderer { 

    @Override 
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 
     int row, int column) { 
    this.setText((String) value); 
    this.setWrapStyleWord(true); 
    this.setLineWrap(true); 

    int fontHeight = this.getFontMetrics(this.getFont()).getHeight(); 
    int textLength = this.getText().length(); 
    int lines = textLength/this.getColumnWidth(); 
    if (lines == 0) { 
     lines = 1; 
    } 

    int height = fontHeight * lines; 
    table.setRowHeight(row, height); 

    return this; 
} 

} 
関連する問題