概要

列幅調整がデフォルトのJTableで、ヘッダの各TableColumnが指定した比率の幅になるように設定します。

サンプルコード

private void setTableHeaderColumnRaito() {
  TableColumnModel m = table.getColumnModel();
  List<Integer> list = getWidthRaitoArray();
  int total = table.getSize().width;
  double raito = total / (double) getRaitoTotal(list);
  for (int i = 0; i < m.getColumnCount() - 1; i++) {
    TableColumn col = m.getColumn(i);
    int colwidth = (int) (.5 + list.get(i) * raito);
    col.setPreferredWidth(colwidth);
    total -= colwidth;
  }
  //最後のカラムで誤差を吸収
  m.getColumn(m.getColumnCount() - 1).setPreferredWidth(total);
  table.revalidate();
}
view all

解説

上記のサンプルでは、JTextFieldにコロン区切りで入力した比率に従って、各カラムヘッダの幅を調整しています。

  • ComponentListener#componentResized(...)がチェックされている場合
    • JScrollPaneに追加したComponentListenerで、リサイズされる毎に全ての列幅を設定し直すので、フレームのサイズを変更してもカラムの比率は保持される
  • ComponentListener#componentResized(...)がチェックされていない場合
    • 列幅調整がAUTO_RESIZE_SUBSEQUENT_COLUMNS(デフォルト)なので、フレームをリサイズすると、その幅の変更(デルタ)が、リサイズ可能なすべての列に分散して加算減算される
      • このため、入力されている比率とは異なる列幅になる

TableColumn#setMaxWidthメソッドでカラムの幅を指定する場合は、マウスのドラッグによるサイズの変更はできません。

参考リンク

コメント