Leggendo l'osservazione di Kleopatra (la sua seconda volta ha suggerito di dare un'occhiata a javax.swing.JXTable , e ora mi dispiace di non aver dato un'occhiata la prima volta :)) ti consiglio di seguire il link
Avevo questa soluzione per lo stesso problema: (ma ti suggerisco di seguire il link sopra) Quando ridimensiona la tabella, ridimensiona la larghezza delle colonne della tabella alla larghezza totale della tabella corrente. per fare questo utilizzo un array globale di int per le larghezze (relative) delle colonne):
private int[] columnWidths=null;
Uso questa funzione per impostare le larghezze delle colonne della tabella:
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);
}
}
Quando imposto i dati chiamo:
setColumnWidths(this.columnWidths);
e al cambio chiamo il ComponentListener impostato al genitore della tabella (nel mio caso il JScrollPane che è il contenitore della mia tabella):
public void componentResized(ComponentEvent componentEvent) {
this.setColumnWidths(this.columnWidths);
}
nota che anche la tabella JTable è globale:
private JTable table;
E qui ho impostato l'ascoltatore:
scrollPane=new JScrollPane(table);
scrollPane.addComponentListener(this);