写点什么

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

  • 2007-07-13
  • 本文字数:941 字

    阅读完需:约 3 分钟

自从 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 = "<br></br> [ label_1 | label3 ]<br></br> [ (300,300)*text1| (150)people ]<br></br> [ <label2 | _ ]<br></br> [ message | buttons ]<br></br>"这段代码创建了一个布局,并以为布局元素建立命名占位符的方式,将布局从实际组件的创建中解耦出来。随后,我们使用下面一小段 Ruby 代码把布局和组件联系起来:

ui = Swing::LEL.new(JFrame, layout) do |c, i|<br></br> c.label_1 = JLabel.new "The chat:"<br></br> c.label2 = JLabel.new "What you're saying:"<br></br> c.label3 = JLabel.new "The people:"<br></br> c.text1 = JTextArea.new<br></br> c.people = JComboBox.new<br></br> c.message = JTextArea.new<br></br> # we'll replace this later with a subcomponent<br></br> c.buttons = JPanel.new<br></br>end定义在布局规格中的占位符(label_1text1等等)通过名称引用和相应的组件关联起来,这种方法使用了 Ruby 的元编程(metaprogramming)特性。

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

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

2007-07-13 10:001070
用户头像

发布了 117 篇内容, 共 18.7 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

week5-(2选1)

未来已来

week5-根据当周学习情况,完成一篇学习总结

未来已来

【架构师训练营 1 期】第九周作业

诺乐

Week_09 作业

golangboy

极客大学架构师训练营

第九周课后练习

饭桶

鹿鼎记 · 韦小宝,丽春院、天地会、入皇宫等五个场景的恶搞版多线程锁学习!

小傅哥

Java 程序员 小傅哥 多线程

讲武德,你们要的高性能日志工具 Log4j2,来了

沉默王二

Java log4j

《Elasticsearch服务器开发》.pdf

田维常

elasticsearch

第九周总结

架构师训练营 - 第 9 周课后作业(1 期)

Pudding

【架构师训练营 1 期】第九周学习总结

诺乐

Week 9 作业02

Croesus

第五周作业

jizhi7

极客大学 - 架构师训练营 第十周作业

9527

智能灯串开发资料全开源!为这个冬天装点烂漫“星空”

智能物联实验室

人工智能 物联网 智能硬件 智能家居

Week_09 总结

golangboy

极客大学架构师训练营

【薪火计划】04 - 心态和角色

码字与律动

管理

田哥:面试被问== 与equals 的区别,该怎么回答?

田维常

面试

记一次HEX和RGB互换算法的思考及应用

徐小夕

Java 面试 算法 大前端

第九周作业

文智

极客大学架构师训练营

经典计算机课程

Joseph295

5G革命:如何让「数据」实现最大性能?

VoltDB

数据库 数据分析 5G 工业互联网

展现非凡领跑力,京东会展云斩获“十大云原生行业落地典范”奖项

京东科技开发者

云计算 AI 云原生

第9周学习总结

饭桶

第九周作业

Istio 中的智能 DNS 代理功能

Jimmy Song

开源 云原生 Service Mesh istio 服务网格

第九周总结

熊桂平

脚手架 | 从零搭建满足权限校验等需求的前端命令行工具

梁龙先森

node.js 大前端

为什么你写的拦截器注入不了 Java bean?

Java旅途

Java spring Spring Boot 拦截器

还在用分库分表?看TiDB如何解决海量数据无感扩容难题

京东科技开发者

数据库 分布式数据库 #TiDB

vivo 调用链 Agent 原理及实践

vivo互联网技术

Java 架构 调用链

使用Profligacy和LEL创建Wiki风格的GUI布局_Java_Werner Schuster_InfoQ精选文章