【问题标题】:Java: Difference between the setPreferredSize() and setSize() methods in componentsJava:组件中的 setPreferredSize() 和 setSize() 方法之间的区别
【发布时间】:2010-12-19 12:29:12
【问题描述】:

setSize()setPreferredSize() 之间的主要区别是什么。有时我使用setSize(),有时使用setPreferredSize(),有时一个做我想做的事,有时另一个做。

JFrames 和JPanels 应该使用什么呼叫?

【问题讨论】:

    标签: java swing jframe jpanel


    【解决方案1】:

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

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

    如果组件的父级使用布局管理器,setSize() 方法可能不会做任何事情;这通常会产生影响的地方是顶级组件(JFrames 和JWindows)以及滚动窗格内的东西。如果父组件中有没有布局管理器的组件,您还必须调用 setSize()

    一般来说,setPreferredSize() 会在布局管理器存在的情况下按预期布局组件;大多数布局管理器通过获取其组件的首选(以及最小和最大)大小来工作,然后使用 setSize()setLocation() 根据布局规则定位这些组件。

    例如,BorderLayout 试图使其“北”区域的边界等于其北分量的首选大小——它们最终可能会更大或更小,具体取决于 @ 的大小987654333@,布局中其他组件的大小等等。

    【讨论】:

    • 我认为组件默认使用布局管理器(BorderLayout?),所以如果我没有明确设置布局管理器,是否意味着我应该使用 setSize() 而不是 setPreferredSize()?
    • 我相信 JPanel 默认使用 BorderLayout,但是 JComponent 没有默认布局。大多数情况下,如果要添加一些东西而不是使用 setSize(),最好设置一个布局管理器。
    • 我的建议是始终使用布局管理器。 SetSize() 应该被认为是布局管理器调用的东西——而不是你调用的东西。
    • @Sbodd - JPanel 默认有一个 FlowLayout。 JFrame.getContentPane() 默认有一个 BorderLayout。
    • 顺便说一句,一个有用的事实是,如果你例如将 Frame 的 setPreferredSize() 设置为非常宽的东西,例如1920 像素,然后有人跑进来,例如1600 分辨率仍会收到一个“适合他们的屏幕”的窗口。这就是我来这里寻找的问题,因为我找不到关于 SO 的明确答案,所以我“为团队拿了一个”并手动测试了它:) - 所以无论如何我认为我至少会在这里提到这一点。
    【解决方案2】:

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

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

    并确保组件的容器使用符合请求大小的布局管理器。 FlowLayoutGridBagLayoutSpringLayout 管理器使用组件的首选大小(后两个取决于您设置的约束),但 BorderLayoutGridLayout 通常不使用。如果您指定新的大小提示对于已经可见的组件,您需要对其调用 revalidate 方法以确保其包含层次结构再次布局。然后调用重绘方法。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 您能否展示一个完整的 setPreferredSize(...) 示例。我认为这会有所帮助。
      【解决方案4】:

      IIRC ...

      setSize 设置组件的大小。

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

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

      【讨论】:

      • 如果我将两个 jpanels 添加到 jframe 而不为 jframe 明确指定布局管理器怎么办?我应该使用什么方法来设置 jpanels 的大小?
      • 内容窗格默认使用 BorderLayout (java.sun.com/docs/books/tutorial/uiswing/layout/using.html)。所以 JFrame 的 contentpane 有一个 LayoutManager,所以 setPreferredSize should 工作..
      • 听起来不错,这意味着我应该对 JFrame 使用 setSize,对内部组件使用 setPreferredSize
      • 您通常会使用 frame.pack() 来利用计算出的所有子组件的首选大小。否则,如果您只是随机使用 frame.setSize(),则添加到内容窗格的组件将扩展/收缩以适应可用空间,这意味着每个组件的首选大小可能会被覆盖。
      猜你喜欢
      • 2023-03-04
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2021-07-15
      • 2011-02-02
      相关资源
      最近更新 更多