Java:组件中setPreferredSize()和setSize()方法之间的差异

Dav*_*les 101 java swing jpanel jframe

好的,我阅读了Java文档,我无法弄清楚这两种方法之间的主要区别.有时我曾经使用过setSize(),有时候setPreferredSize(),有时一个人会做我想要的,有时候是另一个.

那么,两者之间的主要区别是什么?我应该使用哪一个JFramesJPanels

谢谢

Sbo*_*odd 114

简短的回答是:它很复杂.

稍微长一点的答案是:setSize()如果组件的父级没有布局管理器,则使用它,setPreferredSize()以及它的相关性setMinimumSizesetMaximumSize是否相关.

setSize()如果组件的父级使用布局管理器,则可能不会执行任何操作; 通常会产生影响的地方是顶级组件(JFramesJWindows)以及内部的东西scrolled panes.setSize()如果没有布局管理器的父级内部有组件,也必须调用.

作为一般规则,setPreferredSize()如果您有布局管理员,应该做"正确的事"; 大多数布局管理器通过获取其组件的首选(以及最小和最大)大小,然后根据布局规则使用setSize()setLocation()定位这些组件来工作.所以(作为一个例子)一个BorderLayout将努力使其"北"区域的边界等于preferred size其北成分的-它们可能最终比更大或更小,这取决于的大小jframe,其它部件的尺寸在布局中,等等.

  • 我的建议是始终使用布局管理器.SetSize()应该被认为是布局管理器调用的东西 - 而不是你调用的东西. (8认同)
  • @Sbodd - 默认情况下,JPanels有一个FlowLayout.默认情况下,JFrame.getContentPane()具有BorderLayout. (8认同)
  • 我相信JPanels默认使用BorderLayout,但JComponent没有默认布局.大多数情况下,如果你要添加一些东西而不是使用setSize(),你最好设置一个布局管理器. (3认同)

Var*_*run 10

setSize()或者setBounds()可以在没有使用布局管理器时使用.

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

并确保组件的容器使用一个尊重请求大小的布局管理器.的FlowLayout,GridBagLayoutSpringLayout管理人员使用组件的首选大小(后两者取决于您所设置的限制),但BorderLayoutGridLayout平时don't.If您指定的新大小提示为已在可见的一个组成部分,你需要在调用该方法重新验证它确保其包容层次结构再次布局.然后调用重绘方法.


Gle*_*len 5

setSize 将组件的大小调整为指定的大小.

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


mik*_*iku 5

国际研究中心...

setSize设置组件的大小。

setPreferredSize设置首选尺寸。布局管理器将尝试为您的组件安排足够的空间。

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

  • 内容窗格默认使用 BorderLayout (http://java.sun.com/docs/books/tutorial/uiswing/layout/using.html)。因此 JFrame 的内容窗格有一个 LayoutManager,因此 setPreferredSize_should_ 可以工作.. (3认同)