Java:コンポーネントのsetPreferredSize()メソッドとsetSize()メソッドの違い


回答:


116

使用法は、コンポーネントの親にレイアウトマネージャがあるかどうかによって異なります。

  • setSize() -親レイアウトマネージャーが存在しない場合に使用します。
  • setPreferredSize()(また、その関連setMinimumSizeおよびsetMaximumSize)-親レイアウトマネージャーが存在する場合に使用します。

setSize()コンポーネントの親がレイアウトマネージャを使用している場合、このメソッドはおそらく何もしません。これが通常効果を発揮する場所は、トップレベルのコンポーネント(JFramesとJWindows)とスクロールされたペインの内部にあるものです。setSize()レイアウトマネージャーなしで親の内部にコンポーネントがある場合も呼び出す必要があります。

通常、setPreferredSize()レイアウトマネージャーが存在する場合、コンポーネントは期待どおりにレイアウトされます。ほとんどのレイアウトマネージャーは、コンポーネントの推奨サイズ(および最小サイズと最大サイズ)を取得し、レイアウトのルールに従ってそれらのコンポーネントを使用setSize()setLocation()て配置することで機能します。

たとえば、BorderLayoutは、「北」領域の境界をその北コンポーネントの推奨サイズに等しくしようとします---のサイズに応じてJFrame、他のコンポーネントのサイズに応じて、それよりも大きくなったり小さくなったりします。レイアウトなど。


1
コンポーネントがデフォルトでレイアウトマネージャー(BorderLayout?)を使用していると思ったので、明示的にレイアウトマネージャーを設定しない場合、setPreferredSize()ではなくsetSize()を使用する必要がありますか?
David Robles、

3
JPanelsはデフォルトでBorderLayoutを使用すると思いますが、JComponentにはデフォルトのレイアウトがありません。ほとんどの場合、setSize()を使用する代わりに何かを追加する場合は、レイアウトマネージャーを設定した方がよいでしょう。
スボッド2009年

8
私の推奨は、常にレイアウトマネージャを使用することです。SetSize()は、レイアウトマネージャーが呼び出すものとして考える必要があります-呼び出すものではありません。
ケビンの日、

8
@Sbodd-JPanelsにはデフォルトでFlowLayoutがあります。JFrame.getContentPane()には、デフォルトでBorderLayoutがあります。
Nemiの

10

setSize()またはsetBounds()、レイアウトマネージャーが使用されていないときに使用できます。

ただし、レイアウトマネージャーを使用してsetXXXSize()いる場合はsetPreferredSize()setMinimumSize()などのメソッドを使用してレイアウトマネージャーにヒントを提供できます。

また、コンポーネントのコンテナが、要求されたサイズを尊重するレイアウトマネージャを使用していることを確認してください。FlowLayoutGridBagLayout、およびSpringLayout管理者は、(あなたが設定された制約に応じて、後者の2)コンポーネントの推奨サイズを使用しますが、BorderLayoutGridLayoutあなたはすでに目に見えるのコンポーネントの新しいサイズヒントを指定する通常don't.If、あなたは上の再検証メソッドを呼び出す必要がその包含階層が再びレイアウトされることを確認します。次に、repaintメソッドを呼び出します。


5

setSize コンポーネントのサイズを指定したサイズに変更します。

setPreferredSize推奨サイズを設定します。コンポーネントは、それが入っているコンテナーのサイズ、またはユーザーがコンポーネントのサイズを手動で変更した場合、実際にはこのサイズにならない場合があります。


setPreferredSize(...)の完全な例を示してください。これは参考になると思います。
Doug Hauf、2014

4

ちゃんと覚えたら ...

setSize コンポーネントのサイズを設定します。

setPreferredSize推奨サイズを設定します。Layoutmanagerは、コンポーネント用にそのスペースを配置しようとします。

レイアウトマネージャーを使用しているかどうかによって異なります...


また、jframeにレイアウトマネージャーを明示的に指定せずに2つのjpanelをjframeに追加するとどうなりますか?jpanelのサイズを設定するにはどの方法を使用すればよいですか?
David Robles、

3
コンテンツペインはデフォルトでBorderLayoutを使用します(java.sun.com/docs/books/tutorial/uiswing/layout/using.html)。JFrameのcontentPaneでは、LayoutManagerのを持っているので、setPreferredSizeはそうすべきである。..仕事
ミク

いいですね、つまり、JFrameにはsetSizeを使用し、内部のコンポーネントにはsetPreferredSizeを使用する必要があります
David Robles

1
通常、frame.pack()を使用して、すべての子コンポーネントの計算された推奨サイズを利用します。それ以外の場合、frame.setSize()をランダムに使用すると、コンテンツペインに追加されたコンポーネントが利用可能なスペースに合わせて拡大/縮小されます。つまり、各コンポーネントの適切なサイズがオーバーライドされる可能性があります。
camickr 2009年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.