• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:TableColumnの幅を比率で設定
#navi(../)
RIGHT:Posted by [[terai]] at 2005-11-28
*TableColumnの幅を比率で設定 [#s3d330d1]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2005-11-28~
更新日:&lastmod;

#contents

**概要 [#n7b8933d]
TableColumnの幅を比率で設定します。

#screenshot
-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(http://lh6.ggpht.com/_9Z4BYR88imo/TQTNve1sTxI/AAAAAAAAAbQ/BmB7Y2iL7Ws/s800/HeaderRatio.png)

**サンプルコード [#dc125241]
#code{{
 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();
 }
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();
}
}}
-&jnlp;
-&jar;
-&zip;

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

JScrollPaneにComponentListenerを追加して、リサイズ毎に初期化しているので、フレームのサイズを変更してもカラムの比率は保持されます。

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

起動時だけ比率を設定したい場合は、以下のようにTableColumn#setPreferredWidthメソッドを使用することで、マウスのドラッグによるサイズが可能になります。またComponentListenerを追加して初期化しなくても、フレームサイズ変更時には現在のカラム幅の比率などから適当に((詳しくはJTable#doLayout()のデルタの分散を参照してください))リサイズしてくれます((逆にTableColumn#setPreferredWidthメソッドを使用している場合にComponentListenerを追加して初期化してしまうと、比率が微妙に食い違って奇妙な動きになってしまう))。
#code{{
 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();
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();
}}

//**参考リンク
**コメント [#f4b5dfe7]
#comment