Module java.desktop
Package javax.swing

Class SpringLayout

java.lang.Object
javax.swing.SpringLayout
所有已实现的接口:
LayoutManager, LayoutManager2

public class SpringLayout extends Object implements LayoutManager2
SpringLayout根据一组约束条件布置其关联容器的子组件。请参阅The Java Tutorial中的如何使用SpringLayout以查看使用SpringLayout的示例。

每个约束由一个Spring对象表示,控制两个组件边缘之间的垂直或水平距离。这些边缘可以属于容器的任何子组件,或者属于容器本身。例如,可以使用控制组件西(左)边缘和东(右)边缘之间距离的约束来表示组件的允许宽度。组件的允许y坐标可以通过约束组件的北(顶部)边缘和其容器的北边缘之间的距离来表示。

SpringLayout控制的容器的每个子组件,以及容器本身,都有一个与之关联的约束集。这些约束由一个SpringLayout.Constraints对象表示。默认情况下,SpringLayout创建的约束使其关联的组件具有组件的Component.getMinimumSize()Component.getPreferredSize()Component.getMaximumSize()方法返回的最小、首选和最大尺寸。初始时,xy位置没有约束,因此在您约束它们之前,Component将相对于父ContainerInsets定位在0,0处。

您可以通过多种方式更改组件的约束。您可以使用putConstraint方法之一在同一容器中的两个组件的边缘之间建立一个弹簧。或者,您可以使用getConstraints获取适当的SpringLayout.Constraints对象,然后修改一个或多个弹簧。或者,您可以使用getConstraint获取组件的特定边缘的弹簧,并对其进行修改。您还可以通过在将组件添加到其容器时指定约束对象(使用Container.add(Component, Object))来将自己的SpringLayout.Constraints对象与组件关联。

表示每个约束的Spring对象具有最小、首选、最大和当前值。弹簧的当前值在最小值和最大值之间的某处,根据Spring.sum(javax.swing.Spring, javax.swing.Spring)方法描述中给出的公式。当最小值、首选值和最大值相同时,当前值始终等于它们;这种不灵活的弹簧称为strut。您可以使用工厂方法Spring.constant(int)创建struts。Spring类还提供了用于创建其他类型弹簧的工厂方法,包括依赖于其他弹簧的弹簧。

SpringLayout中,每个边缘的位置取决于另一个边缘的位置。如果随后添加约束以为边缘创建新绑定,则将丢弃先前的绑定,边缘仍然依赖于单个边缘。弹簧应仅在容器的边缘和其直接子组件之间连接;当出现将来自不同容器(内部或外部)的组件边缘链接的约束时,SpringLayout的行为是未定义的。

SpringLayout与其他布局管理器的比较


注意: 与许多布局管理器不同,SpringLayout不会自动设置其管理的组件的位置。如果手动编写使用SpringLayout的GUI,请记住通过约束西/东和北/南位置来初始化组件位置。

根据您使用的约束,您可能还需要显式设置容器的大小。


尽管SpringLayout的简单性可以模拟大多数其他布局管理器的行为。对于一些功能,例如FlowLayout提供的换行,您需要创建Spring类的特殊子类。

SpringLayout还提供了一种解决许多无法通过嵌套Box组合解决的复杂布局问题的方法。也就是说,SpringLayout正确遵守LayoutManager2协议,因此可以与其他布局管理器嵌套--这种技术可能比创建其他布局管理器隐含的约束更可取。

SpringLayout的布局操作的渐近复杂度与约束(和/或组件)的数量成线性关系。

警告: 该类的序列化对象将与未来的Swing版本不兼容。当前的序列化支持适用于短期存储或在运行相同Swing版本的应用程序之间的RMI。从1.4版本开始,已将所有JavaBeans的长期存储支持添加到java.beans包中。请参阅XMLEncoder

自1.4版本起:
参见:
  • Field Details

    • NORTH

      public static final String NORTH
      指定组件边界矩形的顶部边缘。
      参见:
    • SOUTH

      public static final String SOUTH
      指定组件边界矩形的底部边缘。
      参见:
    • EAST

      public static final String EAST
      指定组件边界矩形的右边缘。
      参见:
    • WEST

      public static final String WEST
      指定组件边界矩形的左边缘。
      参见:
    • HORIZONTAL_CENTER

      public static final String HORIZONTAL_CENTER
      指定组件边界矩形的水平中心。
      自1.6版本起:
      参见:
    • VERTICAL_CENTER

      public static final String VERTICAL_CENTER
      指定组件边界矩形的垂直中心。
      自1.6版本起:
      参见:
    • BASELINE

      public static final String BASELINE
      指定组件的基线。
      自1.6版本起:
      参见:
    • WIDTH

      public static final String WIDTH
      自1.6版本开始:
      1.6
      参见:
    • HEIGHT

      public static final String HEIGHT
      指定组件边界矩形的高度。
      自1.6版本开始:
      1.6
      参见:
  • Constructor Details

    • SpringLayout

      public SpringLayout()
      构造一个新的SpringLayout
  • Method Details

    • addLayoutComponent

      public void addLayoutComponent(String name, Component c)
      无效果,因为此布局管理器不使用每个组件的字符串。
      指定者:
      addLayoutComponent 在接口 LayoutManager
      参数:
      name - 与组件关联的字符串
      c - 要添加的组件
    • removeLayoutComponent

      public void removeLayoutComponent(Component c)
      移除与指定组件关联的约束。
      指定者:
      removeLayoutComponent 在接口 LayoutManager
      参数:
      c - 从容器中移除的组件
    • minimumLayoutSize

      public Dimension minimumLayoutSize(Container parent)
      从接口复制的描述: LayoutManager
      计算指定容器的最小尺寸维度,考虑其中包含的组件。
      指定者:
      minimumLayoutSize 在接口 LayoutManager
      参数:
      parent - 要布局的组件
      返回:
      容器的最小尺寸
      参见:
    • preferredLayoutSize

      public Dimension preferredLayoutSize(Container parent)
      从接口复制的描述: LayoutManager
      计算指定容器的首选大小维度,考虑其中包含的组件。
      指定者:
      preferredLayoutSize 在接口 LayoutManager
      参数:
      parent - 要布局的容器
      返回:
      容器的首选尺寸
      参见:
    • maximumLayoutSize

      public Dimension maximumLayoutSize(Container parent)
      从接口复制的描述: LayoutManager2
      计算指定容器的最大尺寸维度,考虑其中包含的组件。
      指定者:
      maximumLayoutSize 在接口 LayoutManager2
      参数:
      parent - 目标容器
      返回:
      容器的最大尺寸
      参见:
    • addLayoutComponent

      public void addLayoutComponent(Component component, Object constraints)
      如果constraintsSpringLayout.Constraints的实例,则将约束与指定组件关联。
      指定者:
      addLayoutComponent 在接口 LayoutManager2
      参数:
      component - 要添加的组件
      constraints - 组件的约束
      参见:
    • getLayoutAlignmentX

      public float getLayoutAlignmentX(Container p)
      返回0.5f(居中)。
      指定者:
      getLayoutAlignmentX 在接口 LayoutManager2
      参数:
      p - 目标容器
      返回:
      x轴对齐偏好
    • getLayoutAlignmentY

      public float getLayoutAlignmentY(Container p)
      返回0.5f(居中)。
      指定者:
      getLayoutAlignmentY 在接口 LayoutManager2
      参数:
      p - 目标容器
      返回:
      y轴对齐偏好
    • invalidateLayout

      public void invalidateLayout(Container p)
      从接口复制的描述: LayoutManager2
      使布局无效,表示如果布局管理器缓存了信息,则应丢弃它。
      指定者:
      invalidateLayout 在接口 LayoutManager2
      参数:
      p - 目标容器
    • putConstraint

      public void putConstraint(String e1, Component c1, int pad, String e2, Component c2)
      将组件c1的边缘e1链接到组件c2的边缘e2,边缘之间有固定距离。此约束将导致在所有后续布局操作期间执行赋值
           value(e1, c1) = value(e2, c2) + pad
      参数:
      e1 - 依赖项的边缘
      c1 - 依赖项的组件
      pad - 依赖项和锚点之间的固定距离
      e2 - 锚点的边缘
      c2 - 锚点的组件
      参见:
    • putConstraint

      public void putConstraint(String e1, Component c1, Spring s, String e2, Component c2)
      将组件c1的边缘e1链接到组件c2的边缘e2。随着边缘(e2, c2)的值变化,边缘(e1, c1)将通过取(e2, c2)s的(弹簧)总和来计算。每个边缘必须具有以下值之一:SpringLayout.NORTHSpringLayout.SOUTHSpringLayout.EASTSpringLayout.WESTSpringLayout.VERTICAL_CENTERSpringLayout.HORIZONTAL_CENTERSpringLayout.BASELINE
      参数:
      e1 - 依赖项的边缘
      c1 - 依赖项的组件
      s - 链接依赖项和锚点的弹簧
      e2 - 锚点的边缘
      c2 - 锚点的组件
      参见:
    • getConstraints

      public SpringLayout.Constraints getConstraints(Component c)
      返回指定组件的约束。请注意,与GridBagLayoutgetConstraints方法不同,此方法不会克隆约束。如果没有将约束与此组件关联,则此方法将返回一个默认约束对象,其位置相对于父级的Insets为0,0,宽度/高度受限于组件的最小、最大和首选大小。在调用此方法时,尺寸特性不会被冻结;而是返回一个约束对象,其特性跟踪组件的特性随着其变化而变化。
      参数:
      c - 将返回其约束的组件
      返回:
      指定组件的约束
    • getConstraint

      public Spring getConstraint(String edgeName, Component c)
      返回控制组件边缘与其父级顶部或左侧边缘之间距离的弹簧。该方法不返回边缘的当前绑定,而是返回一个代理,即使边缘随后重新绑定,代理也会跟踪边缘的特性。代理旨在在构建器环境中使用,允许用户以任何顺序定义布局的约束条件。但是,代理提供了在布局的约束条件之间创建循环依赖的手段。这种循环会被SpringLayout在内部检测到,以便布局操作始终终止。
      参数:
      edgeName - 必须是SpringLayout.NORTHSpringLayout.SOUTHSpringLayout.EASTSpringLayout.WESTSpringLayout.VERTICAL_CENTERSpringLayout.HORIZONTAL_CENTERSpringLayout.BASELINE之一
      c - 要获取其边缘弹簧的组件
      返回:
      控制指定边缘与其父级顶部或左侧边缘之间距离的弹簧的代理
      参见:
    • layoutContainer

      public void layoutContainer(Container parent)
      从接口复制的描述: LayoutManager
      对指定的容器进行布局。
      指定者:
      layoutContainer 在接口 LayoutManager
      参数:
      parent - 要进行布局的容器