快速业务通道

基于Java的界面布局DSL设计与实现 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
40).in(C)

其执行结果如下图所示:

图 5. Empty 原子元素示例

基于Java的界面布局DSL设计与实现 - 编程入门网

读者在后面可以看到,正是这个 Empty 以及 beside 和 above 操作的闭包性质为我们描述任意复杂的布局样式提供了可能。

在有了这些基础的布局元素和组合手段后,我们就可以通过组合手段来把一些典型的布局样式抽象出来。在下一小节中读者将会看到,布局语言中的 beside 和 above 组合操作其实就是 Java 中的普通方法,因此我们的布局语言中不需要什么特别的抽象手段。也就是说,我们可以直接使用 Java 中已有的抽象手段。

例如,如果我们希望抽象出这样一种布局样式,其中给定一个布局空间和一个布局组件,我们期望该组件能够按照指定的纵、横留白比例位于该布局空间的中心地带。我们可以把该布局样式抽象出来,并命名它为 center。并可以在更复杂的布局样式中把 center 当作一个基本语素使用。center 的实现如下:

public Component center(Component cp, float hRatio, float vRatio) {    float s1 = (1-2.0* hRatio)/ (1.0 - hRatio);    float s2 = (1-2.0*vRatio)/ (1.0-vRatio);    Component u = above(Empty(), above(cp, Empty(), s2), vRatio);    return beside(Empty(), beside(u, Empty(), s1), hRatio); }

当我们想把一个按钮放置按照在横向 0.2,纵向 0.1 的留白比例放在布局空间 (0,0,100,30) 中时,我们可以简单的进行如下描述:

center(Button().title("I am at center."), 0.1,0.1).at(0,0,300,60).in(C)

其执行结果入下图所示:

图 6. center 示例

基于Java的界面布局DSL设计与实现 - 编程入门网

我们还可以构建出 h_seq 和 v_seq 这样的布局样式,它们分别为把一组给定的布局元素横向顺序排列和纵向顺序排列,其实现如下:

public Component h_seq(Component[] cps) {    int len = cps.length;    if(len == 1) return cps[0];    return beside(cps[0], h_seq(slice(cps, 1, len)), 1.0/len); } public Component v_seq(Component[] cps) {    int len = cps.length;    if(len == 1) return cps[0];    return above(cps[0], v_seq(slice(cps, 1, len)), 1.0/len); }

基于Java的界面布局DSL设计与实现(4)

时间:2011-03-07 IBM 孙鸣 邓辉

其中 slice 方法有 3 个参数,一个为布局元素数组,另外两个为区间的起止位置,该方法把给定布局元素数组中指定起止位置的区间部分作为一个新的布局元素数组返回。这两个方法的实现都比较简单直接。下面是两个应用例子:

Component[] cps = new Component[] { Button().title("1"), Button().title("2"), Button().title("3") }; h_seq(cps).at(0,0,300,60).in(C) v_seq(cps).at(0,0,150,200).in(C)

它们的执行结果入下图所示:

图 7. 执行结果

基于Java的界面布局DSL设计与实现 - 编程入门网

图 8. 执行结果

基于Java的界面布局DSL设计与实现 - 编程入门网

在 center、h_seq、v_seq 这些布局样式的基础上,我们可以定义出更加高阶的样式来,比如,给定一布局元素序列,我们希望它们在给定的布局空间中按照 N 行、M 列排列。我们称之为 block,其实现如下:

public Component block (Component[] cps, int N, int M) {    Component[][] fcps = formalize(cps, N, M);    Component[] rows = new Component[fcps.length];    for(int i = 0; i < fcps.length; i++) {      rows[i] = h_seq(fcps[i]); }    return v_seq(rows); }

其中 formalize 是一个工具方法,它把一个给定的布局元素数组规范化为 N 行 M 列的形式,如果不足则用 Empty 组件补齐。

如果希望在 block 中,每个元素都可以指定一些横向和纵向的留白,则可以定义一个 block_with_margin 布局样式,其实现如下:

public Component block_with_margin(Component[] cps, int N, int M

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号