TITLE:TableColumnの幅を比率で設定

TableColumnの幅を比率で設定

編集者:Terai Atsuhiro~

作成日:2005-11-28
更新日:2021-11-27 (土) 13:30:44
  • category: swing folder: HeaderRatio title: TableColumnの幅を比率で設定 tags: [JTable, JTableHeader, TableColumn, JScrollPane] author: aterai pubdate: 2005-11-28T18:26:47+09:00 description: 列幅調整がデフォルトのJTableで、ヘッダの各TableColumnが指定した比率の幅になるように設定します。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TSs6oj80RcI/AAAAAAAAAxs/hm2gp4ELiDI/s800/HeaderRatio.png

概要

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

概要

TableColumnの幅を比率で設定します。

#screenshot

サンプルコード

#spanend
 private void setRaito() {
   int[] list = getWidthRaitoArray();
   int total = getTotalColumnWidth(table);
   int raito = total/getRaitoTotal(table, list);
   for(int i=0;i<table.getColumnModel().getColumnCount()-1;i++) {
     TableColumn col = table.getColumnModel().getColumn(i);
     int colwidth = list[i]*raito;
     col.setMaxWidth(colwidth);
     total = total - colwidth;
   }
   //最後のカラムで誤差で誤差を吸収
   table.getColumnModel().getColumn(
     table.getColumnModel().getColumnCount()-1).setMaxWidth(total);
   table.revalidate();
 }
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
private void setTableHeaderColumnRaito() {
#spanend
  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();
#spanadd
}
#spanend
  • &jnlp;
  • &jar;
  • &zip;

解説

上記のサンプルでは、テキストフィールドにコロン区切りで入力した比率に従って、ヘッダカラムの幅を調整するようになっています。

解説

上記のサンプルでは、JTextFieldにコロン区切りで入力した比率に従って各カラムヘッダの幅を調整しています。 JScrollPaneにComponentListenerを追加して、リサイズ毎に初期化しているので、フレームのサイズを変更してもカラムの比率は保持されます。
  • ComponentListener#componentResized(...)がチェックされている場合:
    • JScrollPaneに追加したComponentListenerでリサイズが実行されると全ての列幅を設定し直すのでフレームのサイズを変更してもカラムの比率は保持される
  • ComponentListener#componentResized(...)がチェックされていない場合:
    • 列幅調整がAUTO_RESIZE_SUBSEQUENT_COLUMNS(デフォルト)なので、フレームをリサイズするとその幅の変更(デルタ)がリサイズ可能なすべての列に分散して加算減算される
      • このため入力されている比率とは異なる列幅になる
    • TableColumn#setMaxWidthメソッドでカラムの幅を指定する場合、マウスのドラッグによるリサイズは不可
TableColumn#setMaxWidthメソッドでカラムの幅を指定しているので、マウスのドラッグによるサイズの変更はできません。

参考リンク

起動時だけ比率を設定したい場合は、以下のようにTableColumn#setPreferredWidthメソッドを使用することで、マウスのドラッグによるサイズが可能になります。またComponentListenerを追加して初期化しなくても、フレームサイズ変更時には現在のカラム幅の比率などから適当に*1リサイズしてくれます*2
#spanend
 int[] list = getWidthRaitoArray();
 int total = table.getColumnModel().getTotalColumnWidth();;
 int raito = total/getRaitoTotal(table, list);
 for(int i=0;i<table.getColumnModel().getColumnCount()-1;i++) {
   TableColumn col = table.getColumnModel().getColumn(i);
   int colwidth = list[i]*raito;
   // - table.getColumnModel().getColumnMargin();
   col.setPreferredWidth(colwidth);
   total = total - colwidth;
 }
 table.getColumnModel().getColumn(
   table.getColumnModel().getColumnCount()-1).setPreferredWidth(total);
 table.revalidate();
#spandel

コメント

コメント