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

次の問題があります。

5 列の JTable があります。1 つ目は 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]));
        }
4

2 に答える 2

2

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

まず、JTable.doLayout() の API ドキュメントを読んでください。正確な動作が説明されています。最も重要な点は、余分な幅が列全体にどのように分散されるかを理解することです。

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

(postFix I はそれぞれ個々の列と個々の値のすべての合計を示します)、これは max/pref から max/pref の合計への個人差の要因です。妥当な決定のように見えますが、... デフォルトの最大値が Integer.MAX の場合、その係数は prefWidht に関係なく、すべての列でほぼ同じです。これが基本的に、サイズ変更が直感的でないように見える理由と、合理的なデフォルトのサイズ変更動作を得るために maxSize を調整する必要がある理由です (@Lajos Arpad がすでに指摘しているように:-)。

そのため、自分でやろうとする代わりに (LayoutManager の場合と同様に、これは良い考えではありません)、必要に応じて列のプロパティを構成します。

// 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 は任意のマジック ナンバーであることに注意してください。おそらく少し試してみたいと思うでしょう。画面の解像度とユーザーの期待に依存します。

于 2012-02-29T12:51:08.933 に答える
2

優先幅が最小幅よりも小さい場合、または最大幅よりも大きい場合、列は優先幅によってサイズ変更されません。また、最小幅と最大幅も制御して、好みの幅がそれらの間にあることを保証する必要があります。

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

于 2012-02-29T10:19:11.180 に答える