1

問題は解決したと思いますが、なぜこのように機能するのかわかりません。今後同じ間違いを繰り返さないように、誰かが説明してくれることを願っています。

私がやろうとしていることをコンパイルできる簡単な例を次に示します。

public class BoxLayoutTest extends JFrame
{
  public BoxLayoutTest()
  {
    setSize(400,300);
    JPanel mainPanel = new JPanel(new FlowLayout());
    setContentPane(mainPanel);

    JPanel subPanel = new JPanel();
    subPanel.setLayout(new BoxLayout(subPanel, BoxLayout.PAGE_AXIS));
    subPanel.setBackground(Color.BLUE);

    JLabel labelTest = new JLabel("This is a test");
    subPanel.add(labelTest);

    labelTest.setPreferredSize(new Dimension(150, 20));
    mainPanel.add(subPanel);
    System.out.println(mainPanel.getSize());
  }

  public static void main( String[] args )
  {
    BoxLayoutTest testFrame = new BoxLayoutTest();
    testFrame.setVisible(true);
  }
}

最初は、JLabel を含むパネルが適切なサイズでサイズ変更されないという問題がありました。サブパネルの優先サイズとして mainPanel.getSize() のバリエーションを使用していたためであることがわかりました。この例では、機能する実際の数値を使用しています。

古い方法ではうまくいかなかった理由 (実際に誰かに説明してもらいたいことです) は、SOP の行に見られるように、mainPanel.getSize() が幅と高さ 0 を返す理由です。明らかに 400x300 の画面全体を占めています。

パネルにpreferredSizeを設定すべきではないことを教えてくれた@camickrに感謝します。これは、問題の原因を突き止めるのに役立ちました。

4

2 に答える 2

2

mainPanel.getSize()幅と高さが 0 を返すのはなぜですか?

「サブコンポーネントの優先サイズとレイアウトに合わせてpack()これをサイズ変更する」まで、寸法はゼロになります。Window

System.out.println(mainPanel.getSize());
this.pack();
System.out.println(mainPanel.getSize());

コンソール:

java.awt.Dimension[幅=0、高さ=0]
java.awt.Dimension[幅=160、高さ=30]
于 2011-07-09T08:08:00.977 に答える
2

コードを投稿していないため、コードが機能しない理由を言うのは難しいです。数行のランダムなコードでは、コードがプログラムでどのように使用されているかのコンテキストがわかりません。

質問を投稿するときは、問題を示すSSCCEを投稿する必要があります。

接着剤で問題が解決するはずはありません。パネルは表示されるはずですが、期待した位置に表示されない可能性があります。BoxLayout は、追加されたコンポーネントのサイズを変更して、使用可能なスペース全体を埋めようとします。

パネルで setPreferredSize() を使用しないでください。パネルに追加されたすべてのコンポーネントの適切なサイズに基づいて、パネルの適切なサイズを計算するのは、レイアウト マネージャーの仕事です。したがって、あなたのコードはまだ間違っていると思います。

this と this.getContentPane() の入力に違いはありますか

特定のメソッド呼び出しは、フレームのコンテンツ ペインに自動的に転送されるため、最終結果は同じです。JFrame API を読みます。これは、API の説明または問題のメソッドで対処されます。

于 2011-07-09T06:15:29.453 に答える