6

これを最も簡単に言えば、コンポーネントの幅を使用して親コンテナーのサイズを設定しようとしています。ただし、コンポーネントに対して返される幅は、約 4 ピクセルずれています。

詳細: サブパネルが中央に水平に広がっているダイアログがあります。ダイアログは常にこのサブパネルのリストと同じ幅にする必要があり、リストが長くなりすぎたらスクロール バーを使用します。ただし、最初はサブパネルを1つだけ使用してみました。私が何をしても、返されるサブパネルのサイズは常に約 4 ピクセル間違っています。サブパネルの右側に非常に迷惑な 4 ピクセルのギャップがあり、ダイアログが不気味に見えます。より多くのサブパネルが追加されると、効果は明ら​​かに悪化します。

幅を取得するために使用しようとしたもの:

sup-panel.getSize().width;
sub-panel.getBounds().width;
sub-panel.getWidth();
sub-panel.getPreferredSize().width;

すべてが同じ間違った値を返します。

動作させるために呼び出してみた他のこと:

parent.validate();
parent.repaint();
parent.doLayout();

どんな助けでも大歓迎です。意図的なものですか?サイズの背後にある概念がありませんか? 一貫しているように見えますが、これが文書化されていることをどこかで読むことができれば幸いです。

参考までに: Java 1.3 を使用しています (レガシー アプリをサポートしています)。

注: これは、ウィンドウのサイズを変更する問題ではありません。その部分は問題なく発生しています。サブパネルのサイズは、サイズの変更がコードに返される値に反映されるため、適切に設定されているように見えます。値は常にわずかにずれています。

注 2: 親コンテナーで pack() を呼び出すと、ウィンドウが希望どおりに表示されますが、最終的には十分な数のサブパネルが表示された後にスクロール バーが表示される必要があるため、すべてのシナリオで機能するとは限りません。pack() は、この場合、ダイアログを非常に広くし、スクロールバーを役に立たなくします。

編集:私は私の問題を解決しました。かなり恥ずかしいことに、私のサブパネルはすべて、本来あるべき均一な幅ではありませんでした。機能する2つのソリューションがあります。それらをすべて均一にするように強制します。これは、レイアウトの上手さによっては難しい場合があります。もう 1 つは、表示したい最初の n 個のパネルの個々の幅を合計することです。このソリューションを機能させるには、各サブ コンポーネントの幅に +1 を追加する必要があることに注意してください。理由はわかりませんが、さまざまな境界線とレイアウトでテストしましたが、非常に一貫しています。私が十分に考えていないところに、おそらく余分なスペースのピクセルがあると思います。しかし、重要なことは、それが現在完全に機能していることです。数学のサンプルを次に示します (Java 1.3 のキャストを必要とする古い学校の型指定されていないコレクションについては申し訳ありません)。

int width = 0;
for(int i = 0; i < MAX_VISIBLE_PANELS; i++)
{
    width += ((SubPanel)panelList.get(i)).getWidth();
    width ++;//extra pixel per panel
}
4

2 に答える 2

3

次の 2 つのことが思い浮かびます。

  1. この例に示すように、後で参照するためにサブパネルのジオメトリを確立するためにvalidate()beforeを使用できる場合があります。pack()

  2. で指定されたデフォルトのギャップを考慮しなければならない場合があります。FlowLayoutこれは、 のデフォルトのレイアウトですJPanel

于 2011-06-03T20:02:12.857 に答える
2

代わりに、pack()ウィンドウを作成してから、ウィンドウ サイズを使用可能な画面サイズに制限できますか?

于 2011-06-03T19:32:40.780 に答える