[java] Java JTable 설정 열 너비

다음과 같이 열 크기를 설정 한 JTable이 있습니다.

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(400);

이것은 잘 작동하지만 테이블이 최대화되면 마지막 열 오른쪽에 빈 공간이 생깁니다. 크기를 조정할 때 마지막 열의 크기를 창 끝으로 조정할 수 있습니까?

AUTO_RESIZE_LAST_COLUMN문서 에서 속성을 찾았 지만 작동하지 않습니다.

편집 : JTableA의 인 JScrollPane의 선호 크기가 설정됩니다.



답변

당신이 전화를하면 어떻게됩니까 setMinWidth(400)마지막 열 대신setPreferredWidth(400)?

에 대한 JavaDoc JTable에서 문서를 doLayout()매우주의 깊게 읽으십시오 . 다음은 몇 가지 선택 사항입니다.

둘러싸는 창의 크기 조정 결과로 메서드가 호출되면 resizingColumn은 null입니다. 이것은 크기 조정이 JTable의 “외부”에서 발생했으며 변경 사항 (또는 “델타”)이이 JTable의 자동 크기 조정 모드에 관계없이 모든 열에 배포되어야 함을 의미합니다.

이것이 AUTO_RESIZE_LAST_COLUMN도움이되지 않은 이유 일 수 있습니다.

참고 : JTable이 열 너비를 조정할 때 최소 및 최대 값을 절대적으로 존중합니다.

즉, 마지막 열을 제외한 모든 열에 대해 Min == Max를 설정 한 다음 마지막 열에 Min = Preferred를 설정하고 Max를 설정하지 않거나 Max에 대해 매우 큰 값을 설정할 수 있습니다.


답변

을 사용 JTable.AUTO_RESIZE_OFF하면 테이블에서 열의 크기를 변경하지 않으므로 원하는 설정이 적용됩니다. 열을 기본 크기로 설정하는 것이 목표 인 경우 마지막 열이 나머지 창을 채우는 것을 제외하고는 JTable.AUTO_RESIZE_LAST_COLUMNautoResizeMode 를 사용할 수 있지만 다음과 함께 사용할 때 가장 효과적 일 수 있습니다.TableColumn.setMaxWidth() TableColumn 대신와 . 마지막 열을 제외한 모든 열에 대해 setPreferredWidth ().

당신이 만족되면 AUTO_RESIZE_LAST_COLUMN사실 일을하지, 당신의 조합을 실험 할 수 TableColumn.setMaxWidth()TableColumn.setMinWidth()


답변

JTable.AUTO_RESIZE_LAST_COLUMN“모든 크기 조정 작업 중에 마지막 열에 만 조정을 적용” 으로 정의됩니다. 즉 , 코드 끝에 자동 크기 조정 모드 를 설정 해야합니다 . 그렇지 않으면 setPreferredWidth ()가 아무 영향도주지 않습니다.

따라서 귀하의 경우 이것은 올바른 방법입니다.

table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(400);
table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);


답변

이 방법 사용

public static void setColumnWidths(JTable table, int... widths) {
    TableColumnModel columnModel = table.getColumnModel();
    for (int i = 0; i < widths.length; i++) {
        if (i < columnModel.getColumnCount()) {
            columnModel.getColumn(i).setMaxWidth(widths[i]);
        }
        else break;
    }
}

또는 JTable클래스 확장 :

public class Table extends JTable {
    public void setColumnWidths(int... widths) {
        for (int i = 0; i < widths.length; i++) {
            if (i < columnModel.getColumnCount()) {
                columnModel.getColumn(i).setMaxWidth(widths[i]);
            }
            else break;
        }
    }
}

그리고

table.setColumnWidths(30, 150, 100, 100);


답변

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


답변

fireTableStructureChanged();

크기 조정 동작을 기본값으로합니다 ! 열 크기 조정 속성을 설정 한 후이 메서드가 코드의 어딘가에서 호출되면 모든 설정이 재설정됩니다. 이 부작용은 간접적으로 발생할 수 있습니다. 속성이 설정된 후이 메서드가 호출되는 방식으로 링크 된 데이터 모델이 변경된 결과로 Fe.


답변

옵션이 필요하지 않습니다. 마지막 열의 기본 너비를 최대로 설정하면 추가 공간이 모두 사용됩니다.

table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(Integer.MAX_INT);