2

ボックスレイアウトで最大サイズを設定すると、奇妙なことに気付きました。

ウィンドウの右側にパネルの列が必要で、ボックス レイアウトでセットアップしようとしました。8 ~ 10 個または 30 ~ 40 個ある可能性があるため、30 ~ 40 個を占めるのに十分なスペースを与えますが、8 ~ 10 個しかない場合は、使用可能なすべてのスペースを占めるように広がり、かなり奇妙に見えます。だから私は彼らがそれを起こさないようにMaximumSizeを設定すると思った...

...そして、私はそれらのほとんどが消えてしまいました。

それで、私はそれを色付きのパネルの非常に基本的なスタックに分解し、何が起こっているのかを確認しようとしました。そして、続行する方法を考え出しましたが、私はそれが好きではありません.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class BoxLayoutDemo extends JFrame {


  public BoxLayoutDemo() {
    super("JScrollPane Demonstration");
    setSize(800, 600);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    init();
    setVisible(true);
  }

  public void init() {
    setLayout(null);

    JPanel rightPanel = new JPanel();
    rightPanel.setBounds(400,0,400,600);
    rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.PAGE_AXIS));

    JPanel greenPanel = new JPanel();
    JPanel bluePanel = new JPanel();
    JPanel yellowPanel = new JPanel();
    greenPanel.setBackground(Color.GREEN);
    bluePanel.setBackground(Color.BLUE);
    yellowPanel.setBackground(Color.YELLOW);

    rightPanel.add(greenPanel);
    rightPanel.add(bluePanel);
    rightPanel.add(yellowPanel);

    add(rightPanel);



  }

  public static void main(String args[]) {
    new BoxLayoutDemo();
  }
}

...これで期待どおりの結果が得られます。画面の右半分を占める 3 つの色付きのボックスです。

次のようなものを追加すると:

greenPanel.setMaximumSize(new Dimension(400,100));
bluePanel.setMaximumSize(new Dimension(400,100));
yellowPanel.setMaximumSize(new Dimension(400,100));

代わりに、3 つの色付きのボックスの高さはそれぞれわずか 100 ピクセルで、画面の上半分ほどしか占めていません。これも期待どおりです。

でもこれやったら…

greenPanel.setMaximumSize(new Dimension(400,100));
yellowPanel.setMaximumSize(new Dimension(400,100));

青いパネルは、他の 2 つのパネルを押しつぶして、わずか数ピクセルの高さにします。

これはおそらく問題にはならないでしょう。すべての最大サイズを設定することはできますが、それが実際には不可能であるという仮説的な状況では、この動作を変更する方法はありますか?しますか?

編集:

では、test1 を次のように呼び出します。

greenPanel.setMinimumSize(new Dimension(400,100));
yellowPanel.setMinimumSize(new Dimension(400,100));

...とにかく、緑と黄色のパネルの高さは約 200 ピクセルなので、これは何にも影響しません。

テスト2:

greenPanel.setMaximumSize(new Dimension(400,100));
yellowPanel.setMaximumSize(new Dimension(400,100));

...最初に説明したように、青色のパネルが緑色と黄色のパネルを覆い隠します。

テスト3:

greenPanel.setMinimumSize(new Dimension(400,100));
greenPanel.setMaximumSize(new Dimension(400,100));
yellowPanel.setMinimumSize(new Dimension(400,100));
yellowPanel.setMaximumSize(new Dimension(400,100));

...説明したように、実際に実際に起こることはtest2とまったく同じであることを除いて、高さ100ピクセルの緑と黄色のパネルになるはずです。

4

1 に答える 1

1

問題は、bluePane のデフォルトの最大サイズが 32767x32767 になっていることです...

レイアウト マネージャーは、基本的に青色にできる最大のスペースを提供しようとします (私の PC では、デフォルトの最小サイズは 10x10 のようです (デフォルトの推奨サイズも同様です))。

setMaximumSize を使用する代わりに、minimumSize を使用するようにコードを変更した場合

greenPanel.setMinimumSize(new Dimension(400,100));
yellowPanel.setMinimumSize(new Dimension(400,100));

レイアウト マネージャーが青いペインにそれ以上のスペースを割り当てることができなくなったため、目的の結果を得ることができます。

アップデート

それから私は何かが欠けています。

デフォルトのコードを使用すると、3 つのパネルすべてが正常に設定されます。緑と黄色 (最大サイズ) のみを使用すると、説明したように押しつぶされます 緑と黄色の最小サイズを設定すると、3 つのパネルが正常に配置されます

これが私が使用していたコードです。

public void init() {

    setLayout(null);

    JPanel rightPanel = new JPanel();
    rightPanel.setBounds(400,0,400,600);
    rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.PAGE_AXIS));

    JPanel greenPanel = new JPanel();
    JPanel bluePanel = new JPanel();
    JPanel yellowPanel = new JPanel();

      Dimension size = new Dimension(400, 100);

      // Default
    //    greenPanel.setMaximumSize(size);
    //    bluePanel.setMaximumSize(size);
    //    yellowPanel.setMaximumSize(size);

      // Test 1
    //    greenPanel.setMaximumSize(size);
    //    yellowPanel.setMaximumSize(size);

      // Test 2
      greenPanel.setMinimumSize(size);
      yellowPanel.setMinimumSize(size);

    greenPanel.setBackground(Color.GREEN);
    bluePanel.setBackground(Color.BLUE);
    yellowPanel.setBackground(Color.YELLOW);

    rightPanel.add(greenPanel);
    rightPanel.add(bluePanel);
    rightPanel.add(yellowPanel);

    add(rightPanel);

  }

あなたのデフォルト

デフォルト設定

緑と黄の最大のみ (青のデフォルト サイズ)

テスト 1 - 緑と黄色の Max のみ

緑と黄の最小のみ (青のデフォルト サイズ)

テスト 2 - 緑と黄の最小値のみ

今何が起こっているのかを真剣に考えてください。

デフォルトのテストでは、レイアウト マネージャーは、すべてのパネルを均等にレイアウトできると判断しました (高さが同じであるため)。最大サイズが設定されており、そうするためのスペースがあるため、これを行う必要があります。実際、サイズをまったく設定しない場合 (すべてデフォルト)、このようにレイアウトされます。

テスト 1 では、青のペインは緑と黄よりも比例して多くのスペースを必要とする (青の最大高さ = 32767、緑と黄の最大高さ = 100) と判断されたため、それらを押しつぶします (緑と黄の最小高さは 10 ピクセルです)。

テスト 2 では、青色のペインが最大のサイズを受け取るべきであると判断されました (最大サイズは 32767 ですが、最小サイズと優先サイズは 10 であるため)。ただし、緑色と黄色のペインは 100 より小さくできないこともわかっています。ピクセルなので、残りのスペースを青 (この場合は約 100 ピクセル) に割り当てます。

更新 2

さて、これが私が解決したことです:P. 基本的に、最小値のみを使用するか最大値のみを使用するかの違いは、これらのサイズのデフォルト サイズ (最小/最大/優先) になります。

最小値のみを使用している場合、合計最大高さは 98301 です (各コンポーネントの最大値は 32767 です)。これはコンポーネント間で分割する必要があります。レイアウトはファクタリング アプローチを使用します (必要に応じて、すべてのコンポーネントにスペースの一部を提供します)。これを行うには、最大サイズと優先サイズの組み合わせを使用します。

最小サイズのみを使用した場合、実際には 200 ピクセルが割り当てられた緑と黄色 - これは最大サイズの値になりました。最大サイズのみを使用すると、緑と黄色に 11 ピクセルが割り当てられます (青のシェアが大きいため)。

...はい、最小サイズは無視されています...その場合。

割り当てられたスペースの量 (600) が優先スペースの合計 (30) 以上である場合、レイアウト マネージャーはこのパスを使用します。割り当てられたスペース (600) が優先スペースの合計より小さい場合、レイアウト マネージャーは優先/最小サイズの組み合わせを使用して因数分解を計算します...

ドキュメントでは、実際には、レイアウト マネージャーはこれらの (最大/最小/優先) 値の 1 つ以上を無視する可能性があると述べています。これらの値は単なるガイドラインであるためです。

ただし、代わりに設定サイズを使用すると、青と緑に 229 ピクセルが割り当てられます (青は 140 ピクセルのみ)。

この場合、最大サイズと優先サイズを組み合わせるか、GridBagLayout のようなものを使用します。

私は使ったことはありませんが、多くの人が MigLayout を信頼しています。

ヘイ、楽しい質問をありがとう;)

于 2012-07-14T06:31:48.597 に答える