Merlin 的魔力: SpringLayout 管理器

摘自http://tech.it168.com/a2009/0211/265/000000265087_all.shtml

摘自http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f7386c88c7150885ce178e320c051038bef970625559939c3d7a50f35404b9b4656f6f1420c1c49fc848d6b89729329c6269304a8900509342f39e5124b17ec311b4e85f&p=cb759a46d7c059fc57efcd605753c1&newp=836cc54ad5c242e019bac7710f528d231610db2151d7da1f6b82c825d7331b001c3bbfb423231406d1c47b620baf425debf23c7637012ba3dda5c91d9fb4c57479c76663&user=baidu&fm=sc&query=SpringLayout&qid=c854ccd90002264b&p1=5

Merlin 的魔力: SpringLayout 管理器

当 GridBagLayout 不够用的时候

当设计复杂的界面时,许多开发人员总是避免使用功能强大的 GridBagLayout 管理器。他们不去摆弄 GridBagConstraints ,而是使用像 BorderLayout 这样的其他布局管理器来将面板嵌入到面板中。最新引入的 SpringLayout 管理器提供了一种可选方式,其中的组件可以相对于其他组件进行放置。在本文中, Merlin 行家 John Zukowski 向您展示了如何使用这种新的布局管理器。请在 讨论论坛上与作者及其他读者共享您对本文的一些想法(也可以点击文章顶部或底部的 讨论来访问论坛)。

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

  开始使用 SpringLayout

最简使用方法见最下边,标黄色的清单 4. 完整的 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);
10

  这看上去不是特别难,但是当您需要添加下一个组件时,不管是添加到第一个组件的右边还是下面,事情都要更难办一些。您不能简单地在 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 提供了一种简单的方式。图 1 展示了该工具启动时的样子:

  图 1. BeanBuilder 启动屏幕

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

  图 2. BeanBuilder 使用屏幕

  由图 2 可以说明,您可以可视化地将箭头连接到一个指定的 putConstraint() 调用。

pasting

为了演示 SpringLayout 的用法,清单 4 给出了 SpringFormTest 程序,该程序将前面解释过的使用 putConstraint() 的代码片断拼接起来。

  清单 4. 完整的 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 }
26

  图 3 显示了结果:

  图 3. SpringFormTest 实例屏幕

 

伸展后截图

时间: 2024-11-05 15:21:02

Merlin 的魔力: SpringLayout 管理器的相关文章

十七、高级布局管理器

1.箱式布局管理器(BoxLayout) 用来管理一组水平或垂直列的组件. 利用Box类提供的6个不可见组件设置箱式布局管理器组件之间的间距. Box类中的两种不可见类型: 支柱(Strut):设置组件的宽度.高度和大小. 胶水(Glue):类似弹簧,将组件平均分布到容器中. 2.卡片布局管理器(CardLayout) 方法:first().last().next().previous().show() 3.网格组布局管理器(GridBagLayou 属性:gridx和gridy.gridwid

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

作者:郭嘉 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 一 BorderLayout BorderLayout是一种简单的布局策略,可以将其看作一个组件.它把容器分为东.南.西.北.中5个区域,每个组件将占据某个区域.而 这5个区域分别被命名为NORTH, WEST, EAST, CENTER, SOUTH,它们都被定义为静态 常量.静态常量可以直接引用,如

Java布局管理器组件

Java布局管理器组件 所谓布局管理器,就是为容器内的组件提供若干布局策略,每个容器都拥有某种默认布局管理器,用于负责其内部组件的排列.目前开发中,常用的布局管理器有BorderLayout.FlowLayout.GridLayout.GridBagLayout.CardLayout.BoxLayout.SpringLayout.GroupLayout等: 布局管理器种类 BorderLayout FlowLayout GridLayout GridBagLayout CardLayout Bo

MQ队列管理器搭建(一)

多应用单MQ使用场景 如上图所示,MQ独立安装,或者与其中一个应用同处一机.Application1与Application2要进行通信,但因为跨系统,所以引入中间件来实现需求. Application1需要连接MQ,并将消息放入队列Queue中,Application2同样连接MQ,监听在Queue队列上,一旦发现有消息进入则取出该消息进行处理. 下面将给出创建队列管理器和队列的示例: 定义队列管理器名称为Qm1,本地队列名称为Queue,服务器连接通道CHAN_SERVER_CON,监听端口

Keeweb-Linux的密码管理器

如今,我们依赖于越来越多的线上服务.我们每注册一个线上服务,就要设置一个密码:如此,我们就不得不记住数以百计的密码.这样对于每个人来说,都很容易忘记密码.那么,下面兄弟连(www.lampbrother.net )将在本文中为大家介绍 Keeweb,Keeweb是一款 Linux 下的密码管理器,可以为你离线或在线地安全存储所有的密码. 当谈及 Linux 密码管理器时,我们会发现有很多这样的软件.我们已经在 LinuxAndUbuntu 上讨论过像 Keepass 和 Encryptr,一个基

Altium原理图中利用封装管理器批量修改元器件封装

批量修改封装,或者别人拿来原理图让我们画板时,发现封装全不对.如果原理图中同样封装的器件很多时,那么批量修改封装将大大减少你的工作量.下面将我批量修改封装的方法共享给大家. 在原理图界面,打开封装管理器:快捷键T-G,如图,在Design Item ID下选择需要修改的元器件ID,这个ID在设计原理图就确定了,不可以随便改变.如果全局修改本类别的元器件选择这个选项.也可以根据需求选择其他选项.如图,选中需要更改的PC814,并全选. 在图的右下角有Add添加按钮,添加封装,如图: 这时在窗口可以

【IOS开发之Objective-C】书签管理器项目

1.项目 新建一个书签管理器的项目,可以存储书签的网址.中文名.星级.访问量和权限信息,具有增.删.改.查和排序的功能. 2.找对象,抽象类 书签管理器,书签管理器,书签管理器--  多读几次书是不是就找到了对象,书签和管理器.书签包含网址.中文名和星级等信息:管理器里面有书签.那么我就可以抽象出两个类了,一个是书签类,一个是管理器类. 我们在书签管理器里面增.删.改.查和排序书签,在书签里面保存书签具有的属性数据. 3.对象的属性和行为分析 书签管理器的存储关系的分析: 4.类的实现 1.书签

多图片上传管理器

MyCnCart多图片上传图片管理器是您解决MyCnCart后台图片管理的优选方案,具有支持一次性上传多个图片,可以记住浏览器最近打开的文件夹,拖放式上传图片,重定义图片大小,旋转图片,检索图片等众多功能. 特色: 多图片选择上传: 多图片拖放式上传 (支持火狐. Safari.谷歌浏览器Chrome等): 多图片选择并赋予某产品: 键盘快捷键: 列示或网格式文件显示: 根据 A-Z, Z-A排序: 快速浏览图片: 重定义大小.旋转或修剪图片: 不覆盖任何文件: 不需要任何外部文件: 不使用Fl

安全类工具制作第006篇:服务管理器

一.前言 服务是一种在操作系统启动的时候就会启动的进程.在操作系统启动时会有两种程序随着系统启动,一种是普通的Win32程序,另一种则是驱动程序.正是基于服务的这种特性,恶意程序往往也会将自身伪装成正常的服务来实现自启动.因此在反病毒的过程中,还是很有必要对服务项进行查看并管理的. 服务管理器的开发原理与之前所讨论的注册表管理器和进程管理器是类似的,主要也是枚举服务并将其显示在"List Control"控件中.而对于服务的管理,是通过服务相关的API函数来实现的.有了本系列之前几篇文