BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

使用Profligacy和LEL创建Wiki风格的GUI布局

| 作者 Werner Schuster 关注 9 他的粉丝 ,译者 Jason lai 关注 0 他的粉丝 发布于 2007年7月14日. 估计阅读时间: 3 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

自从AWT面世以来,为Java创建GUI布局就成为了人们的一块心病,有许多LayoutManager(布局管理器)因此应运而生,然而它们之中没有一个能够完全解决需要手动干预编写布局代码的问题。实际上,最近加入的GroupLayout颇为适用于在类似Matisse这样的GUI Builder进行配置。

最近,人们又把眼光投向了JRuby。Mongrel创始人Zed Shaw创建了一套JRuby GUI类库,名为Profligacy(在InfoQ刚刚推出的一篇报导中,我们就对JRuby GUI类库Profligacy、Cheri和Swiby进行了介绍)。这套类库包含了布局表达式语言(Layout Expression Language,LEL),用于解决GUI布局问题。

LEL使用Wiki风格的格式化语言,以文本形式定义布局。这使得我们可以用一个简洁的字符串来描述布局规格,而不比长篇累牍编写很多行代码来指明约束或者创建面板层次结构。这门语言使用以Ruby类库Ragel编写的解析器进行解析。

示例代码如下:

layout = "
[ label_1 | label3 ]
[ (300,300)*text1| (150)people ]
[ <label2 | _ ]
[ message | buttons ]
"

这段代码创建了一个布局,并以为布局元素建立命名占位符的方式,将布局从实际组件的创建中解耦出来。随后,我们使用下面一小段Ruby代码把布局和组件联系起来:

ui = Swing::LEL.new(JFrame, layout) do |c, i|
c.label_1 = JLabel.new "The chat:"
c.label2 = JLabel.new "What you're saying:"
c.label3 = JLabel.new "The people:"
c.text1 = JTextArea.new
c.people = JComboBox.new
c.message = JTextArea.new
# we'll replace this later with a subcomponent
c.buttons = JPanel.new
end

定义在布局规格中的占位符(label_1text1等等)通过名称引用和相应的组件关联起来,这种方法使用了Ruby的元编程(metaprogramming)特性。

尽管还有不少其它的布局管理器使用文本布局约束的方式(比如说MigLayout),但Profligacy和LEL通过使用Ruby的特性,向人们展示辅助GUI编程的一种很有趣的方式。LEL并不是专用于某个特定的布局管理器的,但当前的版本使用GroupLayout来创建GUI。

查看英文原文:Wiki-style GUI Layout with Profligacy and LEL

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT