クレオパトラの発言を読んでください (彼女は 2 回目にjavax.swing.JXTableを確認するよう提案しましたが、最初は確認できなくて申し訳ありません:)) リンクをたどることをお勧めします。
同じ問題に対してこの解決策がありました:(ただし、上記のリンクに従うことをお勧めします)テーブルのサイズを変更するときに、テーブルの列幅を現在のテーブルの合計幅に合わせます。これを行うには、(相対的な) 列幅に int のグローバル配列を使用します):
private int[] columnWidths=null;
この関数を使用して、テーブルの列幅を設定します。
public void setColumnWidths(int[] widths){
int nrCols=table.getModel().getColumnCount();
if(nrCols==0||widths==null){
return;
}
this.columnWidths=widths.clone();
//current width of the table:
int totalWidth=table.getWidth();
int totalWidthRequested=0;
int nrRequestedWidths=columnWidths.length;
int defaultWidth=(int)Math.floor((double)totalWidth/(double)nrCols);
for(int col=0;col<nrCols;col++){
int width = 0;
if(columnWidths.length>col){
width=columnWidths[col];
}
totalWidthRequested+=width;
}
//Note: for the not defined columns: use the defaultWidth
if(nrRequestedWidths<nrCols){
log.fine("Setting column widths: nr of columns do not match column widths requested");
totalWidthRequested+=((nrCols-nrRequestedWidths)*defaultWidth);
}
//calculate the scale for the column width
double factor=(double)totalWidth/(double)totalWidthRequested;
for(int col=0;col<nrCols;col++){
int width = defaultWidth;
if(columnWidths.length>col){
//scale the requested width to the current table width
width=(int)Math.floor(factor*(double)columnWidths[col]);
}
table.getColumnModel().getColumn(col).setPreferredWidth(width);
table.getColumnModel().getColumn(col).setWidth(width);
}
}
私が呼び出すデータを設定するとき:
setColumnWidths(this.columnWidths);
変更すると、テーブルの親に設定された ComponentListener を呼び出します (私の場合は、テーブルのコンテナーである JScrollPane です)。
public void componentResized(ComponentEvent componentEvent) {
this.setColumnWidths(this.columnWidths);
}
JTable テーブルもグローバルであることに注意してください。
private JTable table;
そして、ここでリスナーを設定します。
scrollPane=new JScrollPane(table);
scrollPane.addComponentListener(this);