2011-07-09 12 views
1

私は自分の問題を解決したと思いますが、なぜこのように動作するのかわからないので、誰かに説明できると思っています私は今後も同じミスを繰り返すことはありません。ここでBoxLayoutのsetPreferredSize()メソッドは、私が望むように動作するようにはできません

は私が何をしようとしているのコンパイルで簡単な例です:最初は

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、これはどこから問題が発生したのかを理解するのに役立ちました。

答えて

2

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

pack()までの寸法はゼロになり、「このWindowは、そのサブコンポーネントの推奨サイズおよびレイアウトに合わせて大きさせます」。

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

コンソール:

 
java.awt.Dimension[width=0,height=0] 
java.awt.Dimension[width=160,height=30] 
+0

ありがとう!それはそれを説明する! –

2

あなたのコードを投稿していないので、あなたのコードがうまくいかない理由を言うのは難しいです。コードのいくつかのランダムな行は、コードがプログラムでどのように使用されているかのコンテキストを私たちに与えるものではありません。

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

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

パネルでsetPreferredSize()を使用しないでください。レイアウトマネージャは、追加されたすべてのコンポーネントの推奨サイズに基づいて、パネルの推奨サイズを計算することができます。だから私はあなたのコードはまだ間違っていると言うだろう。

この及びthis.getContentPaneを(入力との間の差がある)

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

+0

私は私がSSCCEを投稿することになってることを知っているが、私は私のコメントを外し方法の(90%+)ほとんどが変数宣言をバー掲載。私は残りの部分をコメントしていたので、問題を特定してここに投稿しようとしました。接着剤は実際にそれ自体を修正するものではありませんでしたが、そのように大きなパネルをシミュレートすることができました。これを文脈に入れるために、これは画面上部の全幅を取るべきタイトルバーです。しかし、JLabelの周りを包み込むだけです。これは私が望むものではありません。レイアウトをflowLayoutに変更すると、すべてが機能します。申し訳ありませんが、私のコード例が十分に明確でない場合。 –

+0

あなたのアドバイスを受け取り、JPanelからsetPreferredSizeを削除し、代わりにJLabelに使用しました。うまく行かなかった。ただし、setMaximumSizeを使用すると動作します。これは、preferredSizeが使用する十分なスペースがある場合にpreferredSizeが使用されると考えていたため、preferredSizeの仕組みを実際に理解していないことを意味します。 –

関連する問題