Java: Difference between the setPreferredSize() and setSize() methods in components
好的,我阅读了Java文档,但无法弄清楚这两种方法之间的主要区别是什么。 有时我使用setSize(),有时使用setPreferredSize(),有时一个可以满足我的需要,有时另一个。
那么,两者的主要区别是什么? JFrames和JPanels应该使用哪一个?
谢谢
简短的答案是:很复杂。
稍长一点的答案是:如果组件的父级没有布局管理器,则使用setSize();如果有,则使用setPreferredSize()及其相关的setMinimumSize和setMaximumSize。
如果组件的父级使用布局管理器,则setSize()可能不会执行任何操作。通常会在顶级组件(JFrames和JWindows)以及scrolled panes内部的内容上产生影响的地方。如果您的组件内部没有布局管理器,则还必须调用setSize()。
通常,如果您有布局管理器,则setPreferredSize()应该做"正确的事"。大多数布局管理器的工作方式是获取其组件的首选(以及最小和最大)大小,然后使用setSize()和setLocation()根据布局规则定位这些组件。因此,(例如)BorderLayout将尝试使其"北部"区域的边界等于其北部分量的preferred size-它们最终可能比该区域更大或更小,具体取决于< x18>,布局中其他组件的大小等等。
-
我以为默认情况下组件正在使用布局管理器(BorderLayout?),因此,如果我未明确设置布局管理器,这是否意味着我应该使用setSize()而不是setPreferredSize()?
-
我相信JPanels默认使用BorderLayout,但是JComponent没有默认布局。大多数情况下,如果要添加一些内容而不是使用setSize(),则最好设置一个布局管理器。
-
我的建议是始终使用布局管理器。 SetSize()应该被认为是布局管理器调用的东西,而不是您调用的东西。
-
@Sbodd-JPanels默认具有FlowLayout。 JFrame.getContentPane()默认情况下具有BorderLayout。
不使用布局管理器时,可以使用setSize()或setBounds()。
但是,如果您使用的是布局管理器,则可以使用setXXXSize()方法(例如setPreferredSize()和setMinimumSize()等)向布局管理器提供提示。
并且确保组件的容器使用符合要求的大小的布局管理器。 FlowLayout,GridBagLayout和SpringLayout管理器使用组件的首选大小(后两个取决于您设置的约束),但BorderLayout和GridLayout通常不使用。对于已经可见的组件,您需要在其上调用revalidate方法以确保再次对其包含层次结构进行布局。然后调用repaint方法。
setSize将组件调整为指定大小。
setPreferredSize设置首选大小。取决于组件所在容器的大小,或者用户是否手动调整了组件的大小,该组件实际上可能不是这个大小。
-
您能否显示setPreferredSize(...)的完整示例。我认为这会有所帮助。
IIRC ...
setSize设置组件的大小。
setPreferredSize设置首选大小。
Layoutmanager将尝试为您的组件安排那么多空间。
这取决于您是否使用布局管理器...
-
如果我在jframe中添加两个jpanel而没有为jframe显式指定布局管理器怎么办?我应该使用哪种方法来设置jpanels的大小?
-
内容窗格默认情况下使用BorderLayout(java.sun.com/docs/books/tutorial/uiswing/layout/using.html)。因此,JFrames内容窗格具有LayoutManager,因此setPreferredSize应该可以工作。
-
听起来不错,这意味着我应该对JFrame使用setSize并对内部组件使用setPreferredSize
-
通常,您可以使用frame.pack()来利用所有子组件的首选大小。否则,如果您只是随机使用frame.setSize(),则添加到内容窗格中的组件将展开/收缩以适合可用空间,这意味着可能会覆盖每个组件的首选大小。