javaSwing_5布局管理器

来源:互联网 发布:ubuntu 设置密码 编辑:程序博客网 时间:2024/06/07 00:57

使用布局管理可以实现组件的自动放大和缩小。常用的管理器有FlowLayout、BorderLayout、BoxLayout、GridLayout、GridBagLayout、CardLayout。

    awt下的布局器有:FlowLayout、BorderLayout、GridLayout、GridBagLayout、CardLayout

    swing下的布局器有:BoxLayout、OverlayLayout、ScrollPaneLayout、ViewportLayout、GroupLayout


关于组件的大小设置,

  • 有布局管理器时

jComponent.setPreferred(newDimension(width,height));

  • 没有布局管理器时
jComponent.setBounds(x,y,w,h);


关于计算组件大小和位置的类有:

  1. SizeRequirements

    使用该类进行计算的布局有BoxLayout

1)、优先按照preferred的尺寸显示(即现有空间>=preferred。expandedTile)
        可另分配空间是 现有剩余空间 和 max-preferre的最小值
        如果max和preferred不相等,按照两者的差计算分配剩余空间的系数
        如果max和preferred相等,系数为0,即控件没有缩放系数
        计算单个控件的缩放值
        float play = factor * (req.preferred - req.minimum);
    

2)、如果不满足第一个条件,就表示不能按照preferr的尺寸显示。
        要缩减的总空间为(pref - allocated)和 (pref - min)的最小值。
        如果min和preferred不相等,按照两者的差计算分配收缩空间的系数
        如果min和preferred相等,系数为0,即控件没有缩放系数
        计算单个控件的缩放值
        play = factor * (req.preferred - req.minimum);


LayoutManager接口

voidaddLayoutComponent(String name, Component comp)
          如果布局管理器使用每组件字符串,则将组件 comp 添加到布局,并将它与 name 指定的字符串关联。 voidlayoutContainer(Container parent)
          布置指定容器。 DimensionminimumLayoutSize(Container parent)
          给定指定容器所包含的组件,计算该容器的最小大小维数。 DimensionpreferredLayoutSize(Container parent)
          给定指定容器所包含的组件,计算该容器的首选大小维数。 voidremoveLayoutComponent(Component comp)
          从布局移除指定组件。

LayoutManager2是LayoutManager的子接口

 voidaddLayoutComponent(Component comp, Object constraints)
          使用指定约束对象,将指定组件添加到布局。 floatgetLayoutAlignmentX(Container target)
          返回沿 X 轴的对齐方式。 floatgetLayoutAlignmentY(Container target)
          返回沿 Y 轴的对齐方式。 voidinvalidateLayout(Container target)
          使布局失效,指示如果布局管理器缓存了信息,则应该将其丢弃。 DimensionmaximumLayoutSize(Container target)
          给定指定容器的组件,计算该容器的最大大小维数。

  1. AbsoluteLayout 绝对布局

    通过getContenPane().setLayout(null)将布局管理器设置为null就是使用绝对布局了。这样可以完全控制组件的大小和位置。


  2. FlowLayout 流式布局

    java.awt.FlowLayout,它实现了LayoutManager接口。

    它按照页面上排列单词的类似方式来安排控件--从左到右(或者从右到左),直至没有多余的空间,然后转到下一行。

    流的方向取决于容器的 componentOrientation 属性,它可能是以下两个值中的一个:

    • ComponentOrientation.LEFT_TO_RIGHT
    • ComponentOrientation.RIGHT_TO_LEFT
    流式布局一般用来安排面板中的按钮。它使得按钮呈水平放置,直到同一条线上再也没有适合的按钮。线的对齐方式由 align 属性确定。可能的值为:
    • LEFT  此值指示每一行组件都应该是左对齐的。
    • RIGHT  此值指示每一行组件都应该是右对齐的
    • CENTER  此值指示每一行组件都应该是居中的。
    • LEADING  此值指示每一行组件都应该与容器方向的开始边对齐,例如,对于从左到右的方向,则与左边对齐。
    • TRAILING   此值指示每行组件都应该与容器方向的结束边对齐,例如,对于从左到右的方向,则与右边对齐。

    构造方法摘要FlowLayout()
              构造一个新的 FlowLayout,它是居中对齐的,默认的水平和垂直间隙是 5 个单位。FlowLayout(int align)
              构造一个新的 FlowLayout,它具有指定的对齐方式,默认的水平和垂直间隙是 5 个单位。FlowLayout(int align, int hgap, int vgap)
              创建一个新的流布局管理器,它具有指定的对齐方式以及指定的水平和垂直间隙。

    流布局把每个组件都假定为它的自然(首选)大小。


  3. BorderLayout 边界布局

    java.awt.BorderLayout实现了LayoutManager, LayoutManager2接口

    它可以对容器组件进行安排,并调整其大小,使其符合下列五个区域:北、南、东、西、中。每个区域最多只能包含一个组件,并通过相应的常量进行标识:NORTHSOUTHEASTWESTCENTER。当使用边框布局将一个组件添加到容器中时,要使用这五个常量之一。如果添加组件时没有指定常量,将默认添加到CENTER。

    此外,BorderLayout 支持相对定位常量 PAGE_STARTPAGE_ENDLINE_STARTLINE_END。在ComponentOrientation 设置为ComponentOrientation.LEFT_TO_RIGHT 的容器中,这些常量分别映射到NORTHSOUTHWESTEAST

    为了与以前的版本兼容,BorderLayout 还包括相对定位常量 BEFORE_FIRST_LINEAFTER_LAST_LINEBEFORE_LINE_BEGINSAFTER_LINE_ENDS。这些常量分别等同于PAGE_STARTPAGE_ENDLINE_STARTLINE_END。为了与其他组件使用的相对定位常量一致,应优先使用后一组常量。

    将绝对定位常量与相对定位常量混合会产生无法预料的结果。

    根据其首选大小和容器大小的约束 (constraints:必须是已经指定的绝对位置和相对位置的这几个常量) 对组件进行布局。NORTHSOUTH 组件可以在水平方向上拉伸;而EASTWEST 组件可以在垂直方向上拉伸;CENTER 组件可同时在水平和垂直方向上拉伸,从而填充所有剩余空间。

    构造方法摘要BorderLayout()
              构造一个组件之间没有间距的新边框布局。BorderLayout(int hgap, int vgap)
              构造一个具有指定组件间距的边框布局。


  4. GridLayout 网格布局

    java.awt.GridLayout实现了LayoutManager接口。

    它以矩形网格形式对容器的组件进行布置。容器被分成大小相等的矩形,一个矩形中放置一个组件。

    如果容器的 ComponentOrientation 属性是水平从左到右的,则上述示例生成图 1 中所示的输出。如果容器的 ComponentOrientation 属性是水平从右到左的。

    通过构造方法或 setRowssetColumns 方法将行数和列数都设置为非零值时,指定的列数将被忽略。列数通过指定的行数和布局中的组件总数来确定。因此,例如,如果指定了三行和两列,在布局中添加了九个组件,则它们将显示为三行三列。仅当将行数设置为零时,指定列数才对布局有效。

    构造方法摘要GridLayout()
              创建具有默认值的网格布局,即每个组件占据一行一列。GridLayout(int rows, int cols)
              创建具有指定行数和列数的网格布局。GridLayout(int rows, int cols, int hgap, int vgap)
              创建具有指定行数和列数的网格布局

    首选大小:

    网络布局的首选宽度等于容器中所有组件的最大首选宽度乘以列数,加上水平填充乘以列数减去一,再加上目标容器的左右 insets。

    网络布局的首选高度等于容器中所有组件的最大首选高度乘以行数,加上垂直填充乘以行数减去一,再加上目标容器的上下 insets。

    最小大小:

    网络布局的最小宽度等于容器中所有组件的最大最小宽度乘以列数,加上水平填充乘以列数减去一,再加上目标容器的左右 insets。

    网络布局的最小高度等于容器中所有组件的最大最小高度乘以行数,加上垂直填充乘以行数减去一,再加上目标容器的上下 insets。


  5. GridBagLayout

    java.awt.GridBagLayout实现了LayoutManager和LayoutManager2接口

    GridBagLayout 类是一个灵活的布局管理器,它不要求组件的大小相同便可以将组件垂直、水平或沿它们的基线对齐。每个 GridBagLayout 对象维持一个动态的矩形单元网格,每个组件占用一个或多个这样的单元,该单元被称为显示区域

    每个由 GridBagLayout 管理的组件都与 GridBagConstraints 的实例相关联。Constraints 对象指定组件的显示区域在网格中的具体放置位置,以及组件在其显示区域中的放置方式。除了 Constraints 对象之外,GridBagLayout 还考虑每个组件的最小大小和首选大小,以确定组件的大小。

    网格的总体方向取决于容器的 ComponentOrientation 属性。对于水平的从左到右的方向,网格坐标 (0,0) 位于容器的左上角,其中 X 向右递增,Y 向下递增。对于水平的从右到左的方向,网格坐标 (0,0) 位于容器的右上角,其中 X 向左递增,Y 向下递增。

    为了有效使用网格包布局,必须自定义与组件关联的一个或多个 GridBagConstraints 对象。可以通过设置一个或多个实例变量来自定义GridBagConstraints 对象:

    GridBagConstraints.gridxGridBagConstraints.gridy
    指定包含组件显示区域的前导角的单元,在此显示区域中,位于网格原点的单元地址是 gridx = 0, gridy = 0。对于水平的从左到右的布局,组件的前导角是其左上角。对于水平的从右到左的布局,组件的前导角是其右上角。使用GridBagConstraints.RELATIVE(默认值),指定会将组件直接放置在之前刚添加到容器中的组件的后面(沿 X 轴向为gridx 或 Y 轴向为gridy)。
    GridBagConstraints.gridwidthGridBagConstraints.gridheight
    指定组件的显示区域中行(针对 gridwidth)或列(针对 gridheight)中的单元数。默认值为 1。使用GridBagConstraints.REMAINDER 指定组件的显示区域,该区域的范围是从gridx 到该行(针对gridwidth)中的最后一个单元,或者从gridy 到该列(针对gridheight)中的最后一个单元。 使用GridBagConstraints.RELATIVE 指定组件的显示区域,该区域的范围是从gridx 到其所在行(针对gridwidth)的倒数第二个单元,或者从gridy 到其所在列(针对gridheight)的倒数第二个单元。
    GridBagConstraints.fill
    当组件的显示区域大于组件的所需大小时,用于确定是否(以及如何)调整组件。可能的值为 GridBagConstraints.NONE(默认值)、GridBagConstraints.HORIZONTAL(加宽组件直到它足以在水平方向上填满其显示区域,但不更改其高度)、GridBagConstraints.VERTICAL(加高组件直到它足以在垂直方向上填满其显示区域,但不更改其宽度)和GridBagConstraints.BOTH(使组件完全填满其显示区域)。
    GridBagConstraints.ipadxGridBagConstraints.ipady
    指定布局中组件的内部填充,即对组件最小大小的添加量。组件的宽度至少为其最小宽度加上 ipadx 像素。类似地,组件的高度至少为其最小高度加上ipady 像素。
    GridBagConstraints.insets
    指定组件的外部填充,即组件与其显示区域边缘之间间距的最小量。
    GridBagConstraints.anchor
    指定组件应置于其显示区域中何处。可能的值有三种:绝对值、相对于方向的值和相对于基线的值。相对于方向的值是相对于容器的 ComponentOrientation 属性进行解释的,而绝对值则不然。相关于基线的值是相对于基线进行计算的。有效值包括:

    绝对值

    相对于方向的值

    相对于基线的值

  6. GridBagConstraints.NORTH
  7. GridBagConstraints.SOUTH
  8. GridBagConstraints.WEST
  9. GridBagConstraints.EAST
  10. GridBagConstraints.NORTHWEST
  11. GridBagConstraints.NORTHEAST
  12. GridBagConstraints.SOUTHWEST
  13. GridBagConstraints.SOUTHEAST
  14. GridBagConstraints.CENTER(默认值)
  15. GridBagConstraints.PAGE_START
  16. GridBagConstraints.PAGE_END
  17. GridBagConstraints.LINE_START
  18. GridBagConstraints.LINE_END
  19. GridBagConstraints.FIRST_LINE_START
  20. GridBagConstraints.FIRST_LINE_END
  21. GridBagConstraints.LAST_LINE_START
  22. GridBagConstraints.LAST_LINE_END
  23. GridBagConstraints.BASELINE
  24. GridBagConstraints.BASELINE_LEADING
  25. GridBagConstraints.BASELINE_TRAILING
  26. GridBagConstraints.ABOVE_BASELINE
  27. GridBagConstraints.ABOVE_BASELINE_LEADING
  28. GridBagConstraints.ABOVE_BASELINE_TRAILING
  29. GridBagConstraints.BELOW_BASELINE
  30. GridBagConstraints.BELOW_BASELINE_LEADING
  31. GridBagConstraints.BELOW_BASELINE_TRAILING
  32. GridBagConstraints.weightxGridBagConstraints.weighty
    用于确定分布空间的方式,这对于指定调整行为至关重要。除非在行 (weightx) 和列 (weighty) 中至少指定一个组件的权重,否则所有组件都会聚集在其容器的中央。这是因为,当权重为零(默认值)时,GridBagLayout 对象会将所有额外空间置于其单元网格和容器边缘之间。

    每行可以有一条基线,具体取决于该行中具有有效基线并沿此基线对齐的组件(组件的锚值是 BASELINEBASELINE_LEADINGBASELINE_TRAILING 其中之一)。如果行中没有具有有效基线的组件,则该行没有基线。

    如果组件跨多行,则它与起始行(如果基线调整行为是 CONSTANT_ASCENT)或结束行(如果基线调整行为是 CONSTANT_DESCENT)的基线对齐。用来对齐组件的行称为主导行

    字段摘要 double[]columnWeights
              此字段保持对列权重的重写。 int[]columnWidths
              此字段保持对列最小宽度的重写。protected  Hashtable<Component,GridBagConstraints>comptable
              此哈希表维持组件与其网格包约束之间的关联。protected  GridBagConstraintsdefaultConstraints
              此字段保持包含默认值的网格包约束实例,因此如果某个组件没有与其相关联的网格包约束,则会分配给该组件一个 defaultConstraints 的副本。protected  GridBagLayoutInfolayoutInfo
              此字段保持网格包的布局信息。protected static intMAXGRIDSIZE
              此字段不再用于保留数组和保持向后兼容性。protected static intMINSIZE
              网格包布局可以布置的最小网格。protected static intPREFERREDSIZE
              网格包布局可以布置的首选网格大小。 int[]rowHeights
              此字段保持对行最小高度的重写。 double[]rowWeights
              此字段保持对行权重的重写。

    构造方法摘要GridBagLayout()
              创建网格包布局管理器。


  33. CardLayout 卡片布局

    java.awt.Layout.CardLayout实现了LayoutManager, LayoutManager2接口。

    CardLayout 对象是容器的布局管理器。它将容器中的每个组件看作一张卡片。一次只能看到一张卡片,容器则充当卡片的堆栈。当容器第一次显示时,第一个添加到CardLayout 对象的组件为可见组件。

    卡片的顺序由组件对象本身在容器内部的顺序决定。CardLayout 定义了一组方法,这些方法允许应用程序按顺序地浏览这些卡片,或者显示指定的卡片。addLayoutComponent(java.awt.Component, java.lang.Object) 方法可用于将一个字符串标识符与给定卡片关联,以便进行快速随机访问。

    构造方法摘要CardLayout()
              创建一个间距大小为 0 的新卡片布局。CardLayout(int hgap, int vgap)
              创建一个具有指定水平间距和垂直间距的新卡片布局。



  34. BoxLayout 箱式布局

    javax.swing.BoxLayout实现LayoutManager, LayoutManager2接口。

    允许垂直或水平布置多个组件的布局管理器。这些组件将不包装,因此举例来说,垂直排列的组件在重新调整框架的大小时仍然被垂直排列。

    用水平组件和垂直组件的不同组合嵌套多面板的作用类似于 GridBagLayout,但没那么复杂。

    BoxLayout 管理器是用 axis 参数构造的,该参数指定了将进行的布局类型。有四个选择:

    X_AXIS:从左到右水平布置组件。
    Y_AXIS:从上到下垂直布置组件。
    LINE_AXIS:根据容器的 ComponentOrientation 属性,按照文字在一行中的排列方式布置组件。如果容器的ComponentOrientation 表示水平,则将组件水平放置,否则将它们垂直放置。对于水平方向,如果容器的ComponentOrientation 表示从左到右,则组件从左到右放置,否则将它们从右到左放置。对于垂直方向,组件总是从上到下放置的。
    PAGE_AXIS:根据容器的 ComponentOrientation 属性,按照文本行在一页中的排列方式布置组件。如果容器的ComponentOrientation 表示水平,则将组件垂直放置,否则将它们水平放置。对于水平方向,如果容器的ComponentOrientation 表示从左到右,则组件从左到右放置,否则将它们从右到左放置。对于垂直方向,组件总是从上向下放置的。

    对于所有方向,组件按照将它们添加到容器中的顺序排列。

    BoxLayout 试图按照组件的首选宽度(对于水平布局)或首选高度(对于垂直布局)来排列它们。对于水平布局,如果并不是所有的组件都具有相同的高度,则 BoxLayout 会试图让所有组件都具有最高组件的高度。如果对于某一特定组件而言这是不可能的,则 BoxLayout 会根据该组件的 Y 调整值对它进行垂直调整。默认情况下,组件的 Y 调整值为 0.5,这意味着组件的垂直中心应该与其他 Y 调整值为 0.5 的组件的垂直中心具有相同 Y 坐标。

    同样地,对于垂直布局,BoxLayout 试图让列中的所有组件具有最宽组件的宽度。如果这样做失败,则 BoxLayout 会根据这些组件的 X 调整值对它进行水平调整。对于PAGE_AXIS 布局,基于组件的开始边水平调整。换句话说,如果容器的ComponentOrientation 表示从左到右,则 X 调整值为 0.0 意味着组件的左边缘,否则它意味着组件的右边缘。

    许多程序使用 Box 类,而不是直接使用 BoxLayout。Box 类是使用 BoxLayout 的轻量级容器。它还提供了一些帮助您很好地使用 BoxLayout 的便利方法。要获取您想要的排列,将组件添加到多个嵌套的 box 中是一种功能强大的方法。

    构造方法摘要BoxLayout(Container target, int axis)
              创建一个将沿给定轴放置组件的布局管理器。
  35. OverlayLayout

    javax.swing.OverlayLayout实现了LayoutManager, LayoutManager2接口

    要在彼此顶部安排组件的布局管理器。请求的容器大小将是请求的子容器的最大大小,同时要考虑对齐方式的需求。 对齐方式以满足分配区域中子容器的需求为基础。放置子容器,使他们的对齐点都在彼此的顶部。

    构造方法摘要OverlayLayout(Container target)
              构造执行子容器的覆盖安排的布局管理器。


  36. ScrollPaneLayout

    javax.swing.ScrollPaneLayout实现了LayoutManager, ScrollPaneConstants接口

    JScrollPane 使用的布局管理器。JScrollPaneLayout 负责管理九个组件:一个视口、两个滚动条、一个行标题、一个列标题和四个“角”组件。

    字段摘要protected  JViewportcolHead
              子级列标题。protected  JScrollBarhsb
              滚动窗格的子级水平滚动条。protected  inthsbPolicy
              水平滚动条的显示策略。protected  ComponentlowerLeft
              左下角显示的组件。protected  ComponentlowerRight
              右下角显示的组件。protected  JViewportrowHead
              子级行标题。protected  ComponentupperLeft
              左上角显示的组件。protected  ComponentupperRight
              右上角显示的组件。protected  JViewportviewport
              滚动窗格的子级视口。protected  JScrollBarvsb
              滚动窗格的子级垂直滚动条。protected  intvsbPolicy
              垂直滚动条的显示策略。
    构造方法摘要ScrollPaneLayout()


  37. ViewportLayout

    javax.swing.ViewportLayout实现了LayoutManagef接口。

    JViewport 的默认布局管理器。ViewportLayout 定义应该对大多数应用程序都有用的布局策略。视口使其视图与视口的大小相同,但它不会使视图小于其最小大小。随着视口增大,视图先是在可以看到整个视图之前保持底部对齐,之后是顶部对齐
    构造方法摘要ViewportLayout()

  38. GroupLayout

    javax.swing.GroupLayou实现了LayoutManager, LayoutManager2接口。

    GroupLayout 是一个 LayoutManager,它将组件按层次分组,以决定它们在 Container 中的位置。GroupLayout 主要供生成器使用,但也可以手工编码。分组由 Group 类的实例来完成。GroupLayout 支持两种组。串行组 (sequential group) 按顺序一个接一个地放置其子元素。并行组 (parallel group) 能够以四种方式对齐其子元素。

    每个组可以包含任意数量的元素,其中元素有 GroupComponent 或间隙 (gap)。间隙可被视为一个具有最小大小、首选大小和最大大小的不可见组件。此外,GroupLayout 还支持其值取自LayoutStyle 的首选间隙。

    元素类似于一个弹簧。每个元素都有一个范围,由最小大小、首选大小和最大大小指定。间隙的范围由开发人员指定,或者由 LayoutStyle 确定。Component 的范围通过ComponentgetMinimumSizegetPreferredSizegetMaximumSize 方法确定。此外,添加Component 时,可以指定使用一个特定范围,而不使用该组件的范围。Group 的范围由组的类型确定。ParallelGroup 的范围是其元素范围的最大值。SequentialGroup 的范围是其元素范围的总和。

    GroupLayout 将每个轴 (axis) 单独对待。也就是说,存在一个表示水平轴的组和一个表示垂直轴的组。水平组负责确定沿水平轴的最小大小、首选大小和最大大小,并设置所包含组件的 x 和宽度。垂直组负责确定沿垂直轴的最小大小、首选大小和最大大小,并设置所包含组件的 y 和高度。每个Component 都必须同时存在于水平组和垂直组中,否则,在布局过程中或者在请求最小大小、首选大小或最大大小时,将抛出IllegalStateException

    字段摘要static intDEFAULT_SIZE
              指示组件或间隙的大小应该用于特定的范围值。static intPREFERRED_SIZE
              指示组件或间隙的首选大小应该用于特定的范围值。  构造方法摘要GroupLayout(Container host)
              为指定的 Container 创建 GroupLayout


  39. JGoodies FormLayout

    com.jgoodies.forms.layout.FormLayout

  40. MigLayout

    net.miginfocom.layout.MigLayout


原创粉丝点击