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

自从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

你可能感兴趣的:(使用Profligacy和LEL创建Wiki风格的GUI布局)