• title: JTableのセルの高さを自動調整 tags: [JTable, JTextArea, TableCellRenderer] author: aterai pubdate: 2010-10-25T14:24:03+09:00 description: JTableのセルの高さを、文字列の折り返しに応じて自動調整します。

概要

JTableのセルの高さを、文字列の折り返しに応じて自動調整します。

サンプルコード

private List<List<Integer>> rowColHeight = new ArrayList<>();
private void adjustRowHeight(JTable table, int row, int column) {
  //int cWidth = table.getTableHeader().getColumnModel().getColumn(column).getWidth();
  int cWidth = table.getCellRect(row, column, false).width; //セルの内余白は含めない
  //setSize(new Dimension(cWidth, 1000)); //注目
  setBounds(table.getCellRect(row, column, false)); //もしくは?
  //doLayout();

  int prefH = getPreferredSize().height;
  while(rowColHeight.size() <= row) {
    rowColHeight.add(new ArrayList<Integer>(column));
  }
  List<Integer> colHeights = rowColHeight.get(row);
  while(colHeights.size() <= column) {
    colHeights.add(0);
  }
  colHeights.set(column, prefH);
  int maxH = prefH;
  for(Integer colHeight : colHeights) {
    if(colHeight > maxH) {
      maxH = colHeight;
    }
  }
  if(table.getRowHeight(row) != maxH) {
    table.setRowHeight(row, maxH);
  }
}
View in GitHub: Java, Kotlin

解説

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

参考リンク

コメント