2012-02-29 3 views
1
private float[] cwidth = { 0.1f, 0.3f, 0.3f, 0.2f, 0.1f }; 

setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

for (int i = 0; i < cwidth.length; i++) { 
      getColumnModel().getColumn(i).setPreferredWidth((int) (getPreferredScrollableViewportSize().width * cwidth[i])); 
     } 

설정 나는 다음과 같은 문제가 있습니다동적 TableColumns가의 폭

내가 가진 5 열이 JTable가 있습니다. 첫 번째 문자는 3 자리 숫자이고, 두 번째 문자는 문자열이며, JProgressBar, 다른 문자열 및 버튼입니다.

이제 테이블의 크기에 따라 너비가 필요합니다. 위에서 내 실제 시도를 볼 수는 있지만 작동하지 않습니다.

나는 웹을 이미 검색했지만 크기가 비 동적 크기로 설정되어 있기 때문에 항상 도움이되지 않았다.

도와 주시면 감사하겠습니다.

감사합니다. 나는 이쪽을 좋아한다 !! 여기

내 솔루션 :

for (int i = 0; i < cwidth.length; i++) { 
      getColumnModel().getColumn(i).setPreferredWidth((int) (600 * cwidth[i])); 
      getColumnModel().getColumn(i).setMinWidth((int) (100 * cwidth[i])); 
      getColumnModel().getColumn(i).setMaxWidth((int) (1000 * cwidth[i])); 
     } 

답변

2

테이블의 내부 열 레이아웃을 간섭하는 것은 간단합니다 (기본적으로 열은 "children"으로 지정된 자체 LayoutManager 임). 밝은면 : 기본 동작은 그리 좋지 않습니다. 이미 적당한 크기 조정 모드가 있습니다. 기본 설정 인 resizeAll은 아마도 약간의 설정만으로도 원하는대로 처리 할 수 ​​있습니다 .- 지나치게 직관적이지는 않습니다 :-)

시작하려면 JTable.doLayout()의 api 문서를 읽으십시오. 정확한 동작을 설명합니다. (후위 나는 각각의 열 및 개별 값, 각각의 모든 합계를 나타내는와 함께), 즉 최대의 개인차의 요인

deltaI = (excess) * ((maxI - prefI)/(maxAll - prefAll)) 

입니다

: 가장 중요한 점은 열이 분산되는 방식을 초과하는 폭 이해하는 것입니다/pref를 max/pref의 합계로 설정하십시오. 합리적인 결정 인 것처럼 보입니다. 기본 max가 Integer.MAX 인 경우, 해당 요소는 기본 설정과 상관없이 모든 열에 대해 거의 같습니다. 기본적으로 크기 조정이 너무 직관적이지 않은 이유와 합리적인 기본 크기 조정 동작을 얻기 위해 maxSize (@Lajos Arpad가 이미 지적한대로 :-)를 조정해야하는 이유는 무엇입니까?

그래서 대신 할 - 그것 - 스스로하기 (항상 LayoutManagers와 마찬가지로, 좋은 생각이 아니다하는) 노력의 필요에 따라 열 속성을 구성

// start out with a reasonable pref size, f.i. from a prototype or 
// measuring the actual cell content (both supported by JXTable) 
forEachColumn 
    column.setPreferredWidth(....); 

// then configure the maxWidth proportionally 
private float[] cwidth = { 0.1f, 0.3f, 0.3f, 0.2f, 0.1f }; 
forEachColumn 
    int max = ((int) (1000f * cwidth[columnExt.getModelIndex()])); 
    columnExt.setMaxWidth(max); 

주를 1000 임의이다 마법의 숫자, 당신은 아마 그것과 조금 놀고 싶다, 그것은 화면 해상도와 사용자의 기대에 달려있다.

+1

+1 너무 실용적인 방법, 매우 복잡, 나는 두려워 해요 – mKorbel

+0

그래, 내가 시도하고 어떤 일이 일어날지를 볼 것이다. 비슷한 시도가 있었지만, 도움이되지 않았다. – NotANormalNerd

2

적절한 폭이 다음 열이 적절한 폭으로 크기가 조정되지 않습니다 최대 폭보다 최소 폭보다 작거나 큰 경우. 너비와 너비를 조정하여 너비가 그 너비 사이에 있음을 보장해야합니다.

또한 기본적으로 열 크기가 테이블 크기에 따라 자동으로 조정되므로 자동 크기 조정 모드도 확인해야합니다.

+2

+1 스위치 끄기 전용 자동 리셋 – mKorbel

+0

최대 및 최소 설정을 사용하거나 사용하지 않고 시도했다. setAutoResize의 유무에 관계없이. 그러나 그것을 고정시킬 방법이 없습니다. 올바른 크기를 계산하기 위해 테이블의 실제 크기를 가져올 수 없다는 문제가 있습니다. – NotANormalNerd

+0

JTable 객체의 getColumnModel(). getColumn (index) 메소드를 사용하여 열 객체에 접근하고 있습니까? –