Kleopatra의 발언을 읽고 (그녀가 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);