2009-11-23 16 views
15

JTableでは、いくつかの行を自動的に高さを増やして、複数行のテキスト全体を表示できますか?これは、それが現時点でどのように表示されるかである:私はすべての行の高さを設定したくないJTableの行の高さを自動的に調整する

が、唯一の複数行のテキストを持っているもののために。

答えて

32

確かに行の高さを知る唯一の方法は、レンダリングされた高さを決定するために各セルをレンダリングすることです。あなたのテーブルの後、あなたが行うことができ、データが移入されています

private void updateRowHeights() 
{ 
    for (int row = 0; row < table.getRowCount(); row++) 
    { 
     int rowHeight = table.getRowHeight(); 

     for (int column = 0; column < table.getColumnCount(); column++) 
     { 
      Component comp = table.prepareRenderer(table.getCellRenderer(row, column), row, column); 
      rowHeight = Math.max(rowHeight, comp.getPreferredSize().height); 
     } 

     table.setRowHeight(row, rowHeight); 
    } 
} 

のみ最初の列は、複数の行を含めることができる場合にのみ、その列に上記のコードを最適化することができます。

+1

私はこのためのテーブルモデルが必要ですか? – Wulf

+0

なぜClassCastExceptionをキャッチするのですか?キャストやチェックされていない操作はありません。 –

+0

@KarlRichter、良い点、その理由がわからない。 try/catchが削除されました。 – camickr

1

各行に対して反復処理を行い、各要素の境界ボックスを取得し、それに応じて高さを調整する必要があります。標準のJTable(see this article for a solution for Java ... 1.3.1 = 8 * O)ではこれをサポートしていません。

1

Camickrのソリューションはまったく機能しませんでした。私のデータモデルはダイナミックでしたが、常に変化しました。私は上記の解決策は、配列から来るような静的なデータのために働くと思います。

セルレンダラーコンポーネントのJPanelがあり、prepareRenderer(...)を使用した後、適切なサイズが正しく設定されていませんでした。含まれているウィンドウが既に表示され、再描画された後にサイズが正しく設定されました(実際には、短時間でも未定義の後に2回)。上記のようにupdateRowHeights()メソッドを呼び出すにはどうすればいいですか?私がTable.paint()を呼び出すと(オーバーライドすると)、明らかに無限の再描画が発生します。それは私に2日かかりました。文字通り。私のために働くソリューションはこれです(これは私のコラムに使用したセルレンダラーです):

public class GlasscubesMessagesTableCellRenderer extends MyJPanelComponent implements TableCellRenderer { 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 
      int row, int column) { 
     //this method updates GUI components of my JPanel based on the model data 
     updateData(value); 
     //this sets the component's width to the column width (therwise my JPanel would not properly fill the width - I am not sure if you want this) 
     setSize(table.getColumnModel().getColumn(column).getWidth(), (int) getPreferredSize().getHeight()); 

     //I used to have revalidate() call here, but it has proven redundant 

     int height = getHeight(); 
     // the only thing that prevents infinite cell repaints is this 
     // condition 
     if (table.getRowHeight(row) != height){ 
      table.setRowHeight(row, height); 
     } 
     return this; 
    } 
} 
+1

RowHeightは[this](http://stackoverflow.com/questions/21723025/how-to-set-the-rowheight-dynamically-in-a-jtable)のように動的に設定できます。 – GAVD

+0

GAVDありがとうございます。ああ、私はそれを試みました;)残念ながら、TableModelListenerのイベントは、テーブルのGUIではなくテーブルモデルのイベントです。 GUIは再描画され、GUIコンポーネントのサイズは適切に計算されます。あなたはこの時点でサイズを強制的に計算することができます(私はこれを2日間把握できませんでした)が、なぜでしょうか?とにかく仕事をやり直すだろう。私はこの解決策が汚れていることを知っていますが、2日後にあなたの完璧主義が沈んでいます。 – ed22

関連する問題