InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

JRuby GUI API三剑客

作者 Werner Schuster 译者 Jason Lai 发布于 2007年7月6日

领域
架构 & 设计,
语言 & 开发
主题
Java ,
领域专用语言 ,
富客户端/桌面 ,
Ruby ,
JRuby
标签
元编程 ,
Swing ,
JRuby ,
GUI

Swing早在1998年被加入JRE 1.2版,因为人们已经发现它的前身AWT在面临重要的应用已经力不从心了。Swing广受诟病的问题之一(仅次于性能和外观问题)就是,哪怕构建一些小型应用都需要带来大量的编码工作。因此,又有了一系列基于XML的GUI定义语言应运而生。

现在,JRuby的横空出世又引发了一次全新的浪潮,涌现出许多使用(J)Ruby语言特性的类库,试图让Swing应用的开发变得不那么单调乏味。有了Block,我们就可以从编写冗余的Listener样板代码(Boilerplate Code)中解放出来,而Builder的概念则可以用于在Ruby代码中创建复杂的嵌套GUI。

最近刚问世的API叫做Profligacy,发起人是Zed Shaw。这套API的关注点在于让事件处理变得更加轻而易举,并免去AWT/Swing Listener所需要的所有样板代码。在另一方面,对组件的创建和装配也和普通JRuby代码的形式大同小异,比如说使用new来创建新的Swing小部件。下面让我们来看看Profligacy的范例代码到底是什么样子的:

@ui = Swing::Build.new JFrame, :texts, :label do |c,i|
c.texts = [JTextField.new(10), JTextField.new(10)]
c.texts.each_with_index { |t, n|
t.action_command = "text#{n}"
}
c.label = JLabel.new "Something will show up here."
i.texts = {:action => method(:text_action) }
end

@ui.layout = FlowLayout.new
@ui.build("Two Text Fields Demo").default_close_operation = JFrame::EXIT_ON_CLOSE

def text_action(type, event)
puts "EVENT: #{type} #{event.action_command}"
end

请点击上面的链接查看更多的示例代码。

由Bill Dortch创建的Cheri::Swing则是Cheri项目的一部分,该项目是一套创建Builder应用的框架。Builder可以让开发人员使用非常少量的Ruby代码创建出层次型的结构。

menu_bar {
menu('File') {
mnemonic :VK_F
menu_item('Exit') {
mnemonic :VK_X
on_click { @frame.dispose }
}
}
}

这段示例代码则向我们展示了如何使用Ruby的method_missing和Block来使得我们可以使用非常精炼的代码,创建出一个菜单栏,上面包含了拥有一个菜单项的菜单。这些方法的调用使用的全是Block(包含在花括号内的代码)来执行的。同时还把元编程(Metaprogramming)和method_missing组合起来,用于判断到底是该创建一个新的对象,还是在刚刚创建的对象上执行如mnemonic这样的方法。正如我们看见的on_click调用一样,Cheri::Swing也可以让我们轻而易举地处理事件。on_click也使用了一个Block,它在MenuItem被单击的时候会被执行,这样也就把所有冗余无味的Listener或者Action的构建代码隐藏得一干二净。

由Jean Lazarous创建的实验性项目Swiby,则以一个JRuby DSL的方式克隆了JavaFXScript(就是以前的F3)。尽管Swiby也是用了Builder的概念构造GUI,它还从JavaFX Script中借鉴了bind操作符。这种方式允许人们定义表达式,这些表达式在它们引用的变量被重新赋值之后就会被求值。它使用了一种很精炼的方式来完成事件处理。示例代码如下:

require 'swiby'

class HelloWorldModel
attr_accessor :saying
end
model = HelloWorldModel.new
model.saying = "Hello World"

Frame {
title "Hello World F3"
 width 200
content {
Label {
text bind(model,:saying)
}
}
visible true
}

这几套API到底哪一套更加合乎人们的口味呢?这还有待观察。Swing XML GUI定义类库现在已经俯拾皆是了,而且我们的视线中越来越多新的相似类库接踵而来。与它们的区别则是,JRuby的类库一般来说块头都非常小,目前在Profligacy的例子里只有200行代码,并且还不存在对第三方类库的依赖。这就使得这些类库非常容易理解和维护。此外,由于这些类库全都允许在Ruby中编写GUI定义,它们扩展起来同样也要容易得多。如果有哪些组件的特性或者组合还没有得到支持,我们也可能退回只处理Swing对象的步骤上去,而不必去请求类库的维护者添加一项新特性了。

那么,亲爱的读者,到底哪种编写Ruby GUI代码的方式您更喜欢呢?

查看英文原文:Three approaches to JRuby GUI APIs

代码太丑了 发表人 lu wenhua 发表于
Re: 代码太丑了 发表人 Lai Jason 发表于
  1. 返回顶部

    代码太丑了

    发表人 lu wenhua

    宁可多写点,效率差点,也不用这样的东西,太丑了。

  2. 返回顶部

    Re: 代码太丑了

    发表人 Lai Jason

    呵呵,看来楼上还没有体验到 DSL 的好处。运用 JRuby 你完全可以非常灵活地设计出完全符合你审美观的 GUI Builder DSL。

    我倒觉得 Cheri::Swing 的 GUI DSL 是相当优雅的,感觉完全像在写一个配置文件!几乎缩略掉所有你能看出 Ruby 语法痕迹的代码。如果用过 Delphi 的朋友都会知道一般用可视化设计器设计界面的项目中都会有不少 .dfm 文件,内容其实就是一个结构化的文本文件,用来描述 form 上各个组件以及相应属性,如布局颜色等。其实这就是一个用于描述界面的外部 DSL。用 JRuby 完全有能力构造出和 .dfm 格式相类似的 DSL,而且花点力气甚至可以构造出一个支持组件拖放的可视化界面设计器!

    我预感,随着各大阵营对动态语言的支持愈加火爆,它们会是未来富客户端可视化设计的一个方向的。

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。