動的

2012-02-29 33 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桁の数字、2番目の文字列、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

テーブルの内部列レイアウト(基本的には、列が「子」である独自のLayoutManager)に干渉することは自明ではありません。明るい側:デフォルトの動作はそれほど悪くはない、それはすでに合理的なサイズ変更モードを持っています。デフォルトのresizeAllはほんの少しの設定を必要としますが、これは過度に直感的ではありません:-)

まず、JTable.doLayout()のapi docを読んでください。

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

(Postfixので、私は、それぞれ、個々の列や個々の値のすべての合計を表す)、それが最大の個体差の要因である:最も重要な点は、カラムに分散する方法を超過幅を理解することです/ prefをmax/prefの合計に設定します。合理的な決定のように見える、ちょうど...デフォルトの最大値がInteger.MAXの場合、その要素はその前の値に関係なく、すべての列についてほぼ同じです。これは基本的に、なぜサイズ変更が直感的ではないのか、maxSize(@Lajos Arpadが既に指摘したように:-)を調整して、妥当なデフォルトのサイズ変更動作を得る必要があるのはなぜですか?

ので、代わりの日曜大工をしようとしている(常にLayoutManagersのように、良いアイデアではありません)、必要に応じて列のプロパティを設定:1000は任意であることを

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

注意魔法の数、あなたはおそらくそれを少し再生したい、それは画面の解像度とユーザーの期待に依存します

+1

+1あまりにも実用的な方法、非常に複雑な、私は恐れている – mKorbel

+0

大丈夫感謝私は試して何が起こるかを見てみましょう、私は同様の試みがあったが、それは役に立たなかった。 – NotANormalNerd

2

な幅は、あなたの列が適切な幅でリサイズされることはありません最小限の幅よりも小さいか、最大幅よりも大きい場合。また、最小幅と最大幅を制御して、望ましい幅がそれらの間にあることを保証する必要があります。

また、デフォルトでは、テーブルサイズの変更によって列のサイズが自動的に変更されるため、自動サイズ変更モードもチェックする必要があります。

+2

+1スイッチオフの場合のみオートリサイズ – mKorbel

+0

MaxとMinの設定の有無にかかわらず試しました。 setAutoResizeの有無にかかわらず。それを固定する方法はありません。正しいサイズを計算するためにテーブルの実際のサイズを取得できないという問題があります。 – NotANormalNerd

+0

JTableオブジェクトのgetColumnModel()。getColumn(index)メソッドを使用して列オブジェクトに到達していますか? –