SpringLayout管理器

转载 2010年04月07日 14:26:00

转自 http://www.boxcode.cn/html/JAVA/J2SE/2009/0718/454.html

在 Java 布局管理器方面,最新增加了 SpringLayout 管理器,它是与 Java 1.4 一起发布的。这种布局管理器允许您将“spring”附加到组件上,这样组件就可以相对于其他组件进行布局。例如,利用 SpringLayout 您可以让一个按钮依附于右边框来进行显示,而不管用户将屏幕宽度设为多大。


  开始使用 SpringLayout
  与所有布局管理器一样, SpringLayout 管理器负责安排组件的位置。组件的位置是通过为之提供相关联的约束来进行控制的。对于 SpringLayout 控制的组件,有一个带有 4 个设置值的约束 -- 每个设置值对应于组件的每条边。 SpringLayout 管理器依赖一个 SpringLayout.Constraints 对象来提供这些组件约束。这与 GridBagConstraints 类的工作原理有点类似, GridBagConstraints 类补充了 GridBagLayout 管理器:每个添加到容器中的组件都可以有一个依附在其上的 SpringLayout.Constraints 对象。不过,两者的相似之处仅此而已。


  在使用 GridBagLayout的时候 ,您通常的做法是使用约束将组件添加到容器中。在使用 SpringLayout 管理器的情况下,您通常不必使用约束来添加组件。相反,您可以直接添加组件,然后再分别地为之附加约束。除了 SpringLayout 外,没有什么可以阻止您为组件添加约束 。Constraints 不是一个简单的类。它是 Spring 对象(用于每条边)的一个集合。当您使用 SpringLayout.Constraints 类时,您需要分别地将每个 Spring 约束添加到 SpringLayout.Constraints 。您是通过对组件的某一条边设置特定的约束来向 SpringLayout.Constraints “添加”约束的。通过使用 EAST 、 WEST 、 NORTH 和 SOUTH 这 4 个 SpringLayout 常量,您可以调用 SpringLayout.Constraints 的 setContraints(String edge, Spring spring) 方法,其中 String 类型的参数是 4 个常量中的一个。例如,如果您想将一个组件添加到一个容器的顶部偏左的位置,那么可以建立两个大小固定的 spring,将它们组合起来,然后将组件添加到带有这样组合而成的 spring 集的容器中,如清单 1 所示:
  清单 1. 使用 SpringLayout
  1 Component left = ...;
  2 SpringLayout layout = new SpringLayout();
  3 JPanel panel = new JPanel(layout);
  4 Spring xPad = Spring.constant(5);
  5 Spring yPad = Spring.constant(25);
  6 SpringLayout.Constraints constraint = new SpringLayout.Constraints();
  7 constraint.setConstraint(SpringLayout.WEST, xPad);
  8 constraint.setConstraint(SpringLayout.NORTH, yPad);
  9 contentPane.add(left, constraint);
  


  这看上去不是特别难,但是当您需要添加下一个组件时,不管是添加到第一个组件的右边还是下面,事情都要更难办一些。您不能简单地在 n 像素外添加组件;实际上,您必需为早先的组件添加 padding(补白)。为了找出前一个组件的边,您可以使用 getConstraint() 方法请求布局管理器,为该方法传递您所针对的边和组件,例如 layout.getConstraint(SpringLayout.EAST, left) ,以此来获得第一个组件的正确的边的位置。从这个位置,您可以加进必需的 padding,并将其附加到其他组件的边上,如清单 2 所示:
  清单 2. 使用 SpringLayout 添加第二个组件
  1 Component right = ...;
  2 Spring rightSideOfLeft = layout.getConstraint(SpringLayout.EAST, left);
  3 Spring pad = Spring.constant(20);
  4 Spring leftEdgeOfRight = Spring.sum(rightSideOfLeft, pad);
  5 constraint = new SpringLayout.Constraints();
  6 constraint.setConstraint(SpringLayout.WEST, leftEdgeOfRight);
  7 constraint.setConstraint(SpringLayout.NORTH, yPad);
  8 contentPane.add(right, constraint);
  9


  这种方法非常有效,但是如果组件的数量多起来的话,这种方法就显得单调乏味了。相反,另一种回避中间步骤的方法是先不带约束地直接添加组件,然后再分别地添加约束,使用 SpringLayout 的 putConstraint() 方法将约束连接到组件,如清单 3 所示:
  清单 3. 用 SpringLayout 添加第二个组件
  1 public void putConstraint(String e1, Component c1, int pad,
  2 String e2, Component c2)
  3 public void putConstraint(String e1, Component c1, Spring s,
  4 String e2, Component c2)
  5


  这里,您无需请求组件的边并自己加进 padding, putConstraint() 方法调用为您同时处理了这两个任务。为了演示这一点,清单 4 像清单 3 那样向正确的组件添加了同样的约束,不过这里使用的是 putConstraint(), 而不是直接使用 SpringLayout.Constraints :
  清单 4. 使用 putConstraint() 添加第二个组件
  1 Component left = ...;
  2 Component right = ...;
  3 SpringLayout layout = new SpringLayout();
  4 JPanel panel = new JPanel(layout);
  5 panel.add(left);
  6 panel.add(right);
  7 layout.putConstraint(SpringLayout.WEST, left, 5,
  8 SpringLayout.WEST, panel);
  9 layout.putConstraint(SpringLayout.NORTH, left, 25,
  10 SpringLayout.NORTH, panel);
  11 layout.putConstraint(SpringLayout.NORTH, right, 25,
  12 SpringLayout.NORTH, panel);
  13 layout.putConstraint(SpringLayout.WEST, right, 20,
  14 SpringLayout.EAST, left);
  15


  putConstraint() 方法中的 String 类型参数是 4 个 SpringLayout 常量 EAST、WEST、NORTH 和 SOUTH。当使用 putConstraint() 时,应首先确信指定了未知组件的位置,并将其连接到某样可以计算的或者固定的东西上,比如屏幕的边界。


  用 BeanBuilder 试验 SpringLayout


  为了帮助您亲历 SpringLayout 的用法,Sun 提供了一个名为 BeanBuilder 的工具(参阅 参考资料)。当使用 JavaBeans 组件时,该工具还有更多的用处,不过它也为研究 SpringLayout 提供了一种简单的方式。


  虽然我们不打算讨论 BeanBuilder 工具的细节,但是关于这个工具有一个地方是要谈到的,那就是使用 SpringLayout 连接组件。在每个组件的各条边上共有 4 个小方框,分别对应 north(北)、south(南)、east(东) 和 west(西)。您可以从一个小方框中拖出一个箭头,将其连接到任何其他的小方框。如果该工具再高级一点,它将允许您指定间隙宽度,但是显示的是在开发阶段的一个屏幕:


  由可视化地将箭头连接到一个指定的 putConstraint() 调用。


  为了演示 SpringLayout 的用法,清单 4 给出了 SpringFormTest 程序,该程序将前面解释过的使用 putConstraint() 的代码片断拼接起来。
  清单 5. 完整的 SpringLayout 实例
  1 import java.awt.*;
  2 import javax.swing.*;
  3 public class SpringFormTest {
  4 public static void main(String args[]) {
  5 JFrame frame = new JFrame("Spring Form");
  6 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  7 Container contentPane = frame.getContentPane();
  8 SpringLayout layout = new SpringLayout();
  9 contentPane.setLayout(layout);
  10 Component left = new JLabel("Left");
  11 Component right = new JTextField(15);
  12 contentPane.add(left);
  13 contentPane.add(right);
  14 layout.putConstraint(SpringLayout.WEST, left, 10,
  15 SpringLayout.WEST, contentPane);
  16 layout.putConstraint(SpringLayout.NORTH, left, 25,
  17 SpringLayout.NORTH, contentPane);
  18 layout.putConstraint(SpringLayout.NORTH, right, 25,
  19 SpringLayout.NORTH, contentPane);
  20 layout.putConstraint(SpringLayout.WEST, right, 20,
  21 SpringLayout.EAST, left);
  22 frame.setSize(300, 100);
  23 frame.show();
  24 }
  25 }

JavaSwing_1.8: SpringLayout(弹性布局)

SpringLayout,弹性布局管理器。使用该布局的容器内的每一个组件或容器都对应着一个约束,通过该约束定义组件或容器四条边的坐标位置来实现对组件的布局。该布局主要涉及三个类: SpringLayo...
  • xietansheng
  • xietansheng
  • 2017年06月04日 23:58
  • 1343

SpringLayout弹簧锚定显示效果,putconstraint()

这两天在研究SpringLayout的弹簧的效果,搞了我好久。本来打算放弃的,好在最后还是静下心来重新慢慢研究,以下是我的研究结果,转载的请注明出处。 编译环境:Netbeans 6.1 ...
  • pianistOfSoftware
  • pianistOfSoftware
  • 2016年07月15日 15:18
  • 713

布局管理器之FlowLayout、BorderLayout、SpringLayout

Java swing做前端时常常遇到布局管理器,现对FlowLayout、BorderLayout、SpringLayout进行说明记录 Java虽然可以以像素为单位对组件进行精确的定位,但...
  • leijie0322
  • leijie0322
  • 2017年11月13日 11:56
  • 119

Swing代码分析(布局-SpringLayout)

package nau.ui;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.s...
  • nauwzj
  • nauwzj
  • 2010年02月21日 11:57
  • 3291

SpringLayout管理器

转自 http://www.boxcode.cn/html/JAVA/J2SE/2009/0718/454.html在 Java 布局管理器方面,最新增加了 SpringLayout 管理器,它是与 ...
  • java_jun
  • java_jun
  • 2010年04月07日 14:26
  • 1017

Android ConstraintLayout布局的使用

在今年的Google I/O大会上,Google推出了Android Studio2.2,同时也推出了一种新的布局ConstraintLayout布局,称为约束布局,本文我们就来简单了解一下这个新布局...
  • freelander_j
  • freelander_j
  • 2016年11月11日 12:40
  • 550

Java布局管理器(六)SpringLayout布局管理

SpringLayout布局管理器  SpringLayout布局器是通过定义组件边缘之间的距离来对组件在容器之中组件的布局进行管理而工作的。这样,当一个组件的位置确定后,另一个组件某个边缘的位置可...
  • shiShuiNanCheng
  • shiShuiNanCheng
  • 2013年07月16日 04:44
  • 1152

VS2013配置opencv属性管理器

VS2013配置opencv属性管理器,下次新建项目时,若要用到opencv的库,只需要直接在项目属性管理器中直接添加即可。做到一次配置,反复使用。...
  • shitsnail
  • shitsnail
  • 2016年10月27日 15:25
  • 5571

【Java Swing探索之路系列】之三:Java Swing布局管理器组件

作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWel...
  • AllenWells
  • AllenWells
  • 2015年06月30日 10:20
  • 6896

Java利用弹簧控制组件大小

package com.han; import java.awt.Container; import javax.swing.JButton; import javax.swing.JFrame;...
  • Gaowen_HAN
  • Gaowen_HAN
  • 2012年07月12日 04:37
  • 1603
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SpringLayout管理器
举报原因:
原因补充:

(最多只允许输入30个字)