Java JTable 설정 열 너비


95

다음과 같이 열 크기를 설정 한 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의 선호 크기가 설정됩니다.

답변:


45

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

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

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

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

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

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


1
setMinWidth는 (400)는 여전히 테이블의 오른쪽이 비어 원인
함자 여리 카야

2
setMaxWidth (10000)을 추가하여 차이가 있는지 확인하십시오.
Eddie

1
줄 제거 table.setAutoResizeMode (JTable.AUTO_RESIZE_OFF); 이로 인해 원하는 크기 조정이 방지 될 수 있습니다.
Eddie

JTable 자체에 최소 및 최대 크기를 설정하고 싶을 수도 있습니다. 아직 설정하지 않은 경우
Eddie

3
테이블 모델 적용한 setMinWidth 호출을 수행했는지 확인하십시오 .
Brian Knoblauch 2011

23

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

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


1
AUTO_RESIZE_LAST_COLUMN을 사용하면 스크롤 창에 맞게 테이블 크기가 조정됩니다. 내 목표는 테이블을 특정 최소 크기로 유지하지만 최소 크기보다 클 경우 테이블을 늘리는 것입니다.
Hamza Yerlikaya

TableColumn.setMaxWidth () 대신 TableColumn.setMinWidth ()를 사용하면이 동작이 발생할 수 있습니다.
akf 2009-06-05

내 마지막 주석에 추가하려면 마지막 열을 포함하여 테이블의 각 열에 대해 TableColumn.setMinWidth ()를 사용하십시오.
akf 2009-06-05

최소 및 최대 너비를 모두 설정하면 문제가 해결되었지만 이제 스크롤 막대가 누락되었습니다.
Hamza Yerlikaya

14

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

5

이 방법 사용

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

4

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

1
내가 볼 수있는 한, 이것은 (매우 부서지기 쉬운) 해킹입니다. 사용자가 열 너비를 변경해도 업데이트되지 않습니다. 다시 말하지만, JXTable의 소스 코드를 살펴볼 것을 제안합니다. 열 환경 설정의 합이 현재 너비보다 작 으면 사용 가능한 너비를 채우도록 트리거하는 추가 속성 horizontalScroll이 있고 그렇지 않으면 가로 스크롤바가 표시됩니다.
kleopatra

나는 그것이 사용자가 테이블 너비를 수동으로 변경하는 것에 반응하지 않는다는 것을 알고 있습니다. 그런 식으로 그것은 해킹입니다 ...하지만 다시 말하지만 위에서 제안한 것보다 낫습니다. 하지만 JXTable에 호기심이 생겼습니다 .... 거기를 살펴 볼게요! (그리고 테이블 주제에 대해 다시 당신에게 걸어 가서 반갑습니다 :))
michel.iamit 2011

당신이 옳았습니다. 내 대답 위에 내 발언을 참조하십시오. 나는 당신의 발언을 찬성했습니다!
michel.iamit 2011

적어도 이것은 나에게 유용했으며 컬럼 가중치 원칙을 사용하여 내 경우 에이 접근 방식을 사용했습니다.
Solostaran14

2
fireTableStructureChanged();

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


1

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

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

0

이 코드는 setAutoResizeModes없이 저를 위해 작동합니다.

        TableColumnModel columnModel = jTable1.getColumnModel();
        columnModel.getColumn(1).setPreferredWidth(170);
        columnModel.getColumn(1).setMaxWidth(170);
        columnModel.getColumn(2).setPreferredWidth(150);
        columnModel.getColumn(2).setMaxWidth(150);
        columnModel.getColumn(3).setPreferredWidth(40);
        columnModel.getColumn(3).setMaxWidth(40);

-1

이 코드를 사용하십시오. 그것은 나를 위해 일했습니다. 나는 3 개의 열을 고려했다. 코드의 루프 값을 변경하십시오.

TableColumn column = null;
for (int i = 0; i < 3; i++) {
    column = table.getColumnModel().getColumn(i);
    if (i == 0) 
        column.setMaxWidth(10);
    if (i == 2)
        column.setMaxWidth(50);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.