Java:组件中的setPreferredSize()和setSize()方法之间的区别


Answers:


116

用法取决于组件的父级是否具有布局管理器。

  • setSize() -在父级布局管理器不存在时使用;
  • setPreferredSize()(及其相关的setMinimumSizesetMaximumSize)-在存在父级布局管理器时使用。

setSize()如果组件的父级使用布局管理器,则该方法可能不会执行任何操作。通常会在顶层组件(JFrames和JWindows)以及滚动窗格内部的内容上产生影响的地方。setSize()如果您的组件内部没有布局管理器,则还必须调用。

通常,setPreferredSize()如果存在布局管理器,则将按预期布置组件;大多数布局管理器的工作方式是获取其组件的首选(以及最小和最大)大小,然后根据布局规则使用setSize()setLocation()放置这些组件。

例如,BorderLayout尝试使“北部”区域的边界等于其北部部分的首选大小-最终可能会大于或小于该大小,具体取决于JFrame的大小,其他部分的大小在布局中,依此类推。


1
我以为默认情况下组件正在使用布局管理器(BorderLayout?),所以如果我未明确设置布局管理器,这是否意味着我应该使用setSize()而不是setPreferredSize()?
David Robles

3
我相信JPanels默认使用BorderLayout,但是JComponent没有默认布局。在大多数情况下,如果要添加一些内容而不是使用setSize(),则最好设置一个布局管理器。
Sbodd

8
我的建议是始终使用布局管理器。SetSize()应该被认为是布局管理器调用的东西,而不是您调用的东西。
凯文·戴

8
@Sbodd-JPanel默认情况下具有FlowLayout。JFrame.getContentPane()默认情况下具有BorderLayout。
Nemi

10

setSize()setBounds()在不使用布局管理器时使用。

但是,如果您使用的是布局管理器可以提供使用提示,布局管理器setXXXSize()类似的方法setPreferredSize()setMinimumSize()等。

并确保组件的容器使用符合要求大小的布局管理器。的FlowLayoutGridBagLayoutSpringLayout管理人员使用组件的首选大小(后两者因限制设置),但BorderLayoutGridLayout平时don't.If您指定的新大小提示为已在可见的一个组成部分,你需要调用重新验证方法上以确保重新布置其包含层次结构。然后调用repaint方法。


5

setSize 将组件调整为指定大小。

setPreferredSize设置首选大小。取决于组件所在容器的大小,或者用户是否手动调整了组件的大小,该组件实际上可能不是这个大小。


您能否显示setPreferredSize(...)的完整示例。我认为这会有所帮助。
Doug Hauf 2014年

4

IIRC ...

setSize 设置组件的大小。

setPreferredSize设置首选大小。Layoutmanager将尝试为您的组件安排那么多空间。

这取决于您是否使用布局管理器...


如果我在jframe中添加两个jpanel而没有为jframe显式指定布局管理器怎么办?我应该使用什么方法来设置jpanels的大小?
David Robles,2009年

3
默认情况下,内容窗格使用BorderLayout(java.sun.com/docs/books/tutorial/uiswing/layout/using.html)。因此,JFrame的contentpane具有LayoutManager,因此setPreferredSize 应该可以工作..
miku

听起来不错,这意味着我应该对JFrame使用setSize并对内部组件使用setPreferredSize
David Robles,2009年

1
通常,您将使用frame.pack()来利用所有子组件的首选大小。否则,如果您只是随机使用frame.setSize(),则添加到内容窗格中的组件将展开/收缩以适应可用空间,这意味着可能会覆盖每个组件的首选大小。
camickr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.