• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableのセルの高さを自動調整
#navi(../)
RIGHT:Posted by [[terai]] at 2010-10-25
*JTableのセルの高さを自動調整 [#pe4a7c92]
JTableのセルの高さを、文字列の折り返しに応じて自動調整します。

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

#screenshot

**サンプルコード [#f1f7d94f]
#code{{
JTable table = new JTable(model) {
  @Override public void doLayout() {
    initPreferredHeight();
    super.doLayout();
  }
  @Override public void columnMarginChanged(ChangeEvent e) {
    initPreferredHeight();
    super.columnMarginChanged(e);
  }
  private void initPreferredHeight() {
    int vc = convertColumnIndexToView(AUTOWRAP_COLUMN);
    TableColumn col = getColumnModel().getColumn(vc);
    for(int row=0; row<getRowCount(); row++) {
      Component c = prepareRenderer(col.getCellRenderer(), row, vc);
      if(c instanceof JTextArea) {
        JTextArea a = (JTextArea)c;
        int h = getPreferredHeight(a); // + getIntercellSpacing().height;
        //if(getRowHeight(row)!=h)
        setRowHeight(row, h);
      }
    }
  }
  //http://tips4java.wordpress.com/2008/10/26/text-utilities/
  private int getPreferredHeight(JTextComponent c) {
    Insets insets = c.getInsets();
    View view = c.getUI().getRootView(c).getView(0);
    int preferredHeight = (int)view.getPreferredSpan(View.Y_AXIS);
    return preferredHeight + insets.top + insets.bottom;
  }
};
}}

**解説 [#cef4d3e6]
上記のサンプルでは、セルレンダラーに、setLineWrap(true)としたJTextAreaを使用し、カラムサイズの変更などがあったときに、そのJTextAreaの高さを取得してJTable#setRowHeight(int)メソッドで各行の高さとして設定しています。

**参考リンク [#xfcd757b]
-[[Text Utilities « Java Tips Weblog>http://tips4java.wordpress.com/2008/10/26/text-utilities/]]

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