Membaca ucapan Kleopatra (kali kedua dia menyarankan untuk melihat javax.swing.JXTable , dan sekarang saya minta maaf saya tidak melihat pertama kali :)) Saya sarankan Anda mengikuti tautan
Saya punya solusi ini untuk masalah yang sama: (tapi saya sarankan Anda mengikuti tautan di atas) Saat mengubah ukuran tabel, skala lebar kolom tabel ke lebar total tabel saat ini. untuk melakukan ini saya menggunakan array int global untuk lebar kolom (relatif)):
private int[] columnWidths=null;
Saya menggunakan fungsi ini untuk mengatur lebar kolom tabel:
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);
}
}
Saat mengatur data yang saya panggil:
setColumnWidths(this.columnWidths);
dan saat mengubah saya memanggil ComponentListener yang disetel ke induk tabel (dalam kasus saya, JScrollPane yang merupakan wadah dari tabel saya):
public void componentResized(ComponentEvent componentEvent) {
this.setColumnWidths(this.columnWidths);
}
perhatikan bahwa tabel JTable juga global:
private JTable table;
Dan di sini saya mengatur pendengar:
scrollPane=new JScrollPane(table);
scrollPane.addComponentListener(this);