TITLE:TableColumnの幅を比率で設定

TableColumnの幅を比率で設定

編集者:Terai Atsuhiro
作成日:2005-11-28
更新日:2021-11-27 (土) 13:30:44

概要

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

#screenshot

サンプルコード

private void setRaito() {
  javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      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;

解説

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

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

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

起動時だけ比率を設定したい場合は、以下のようにTableColumn#setPreferredWidthメソッドを使用することで、マウスのドラッグによるサイズが可能になります。またComponentListenerを追加して初期化しなくても、フレームサイズ変更時には現在のカラム幅の比率から適当にリサイズしてくれます*1

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();

コメント