概要

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

サンプルコード

private List<List<Integer>> rowAndCellHeightList= 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)); //setSizeの代わりに、setBoundsでも可
  //doLayout(); //必要なさそう

  int preferredHeight = getPreferredSize().height;
  while (rowAndCellHeightList.size() <= row) {
    rowAndCellHeightList.add(new ArrayList<Integer>(column));
  }
  List<Integer> cellHeightList = rowAndCellHeightList.get(row);
  while (cellHeightList.size() <= column) {
    cellHeightList.add(0);
  }
  cellHeightList.set(column, preferredHeight);
  //JDK 1.8.0: int max = cellHeightList.stream().max(Integer::compare).get();
  int max = preferredHeight;
  for (int h: cellHeightList) {
    max = Math.max(h, max);
  }
  if (table.getRowHeight(row) != max) {
    table.setRowHeight(row, max);
  }
}
view all

解説

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

参考リンク

コメント

  • 高さが微妙に更新されない場合がある…。 -- aterai
  • フレームのサイズ(JTableの高さ)を微妙に調整すると、スクロールバーが表示・非表示を繰り返す場合がある。 -- aterai
  • 上二つの原因は同じだと思うけど、今のところ何が問題なのか分からず、お手上げ状態です。 -- aterai
  • レンダラーに以下のようなコードを追加して調整するサンプルを発見: JTable multiline cell renderer -- aterai
    • この方法だと、セルを描画する毎に、行の高さを調整するようになるので、これまでのドラッグでリサイズ中の微妙なサイズは無くなるはず(多少重くなるかもしれないけど、違いは全く感じられない)。 -- aterai