写点什么

JRuby GUI API 三剑客

  • 2007-07-06
  • 本文字数:1817 字

    阅读完需:约 6 分钟

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|<br></br> c.texts = [JTextField.new(10), JTextField.new(10)]<br></br> c.texts.each_with_index { |t, n|<br></br> t.action_command = "text#{n}"<br></br> }<br></br> c.label = JLabel.new "Something will show up here."<br></br> i.texts = {:action => method(:text_action) }<br></br>end<p>@ui.layout = FlowLayout.new</p><br></br>@ui.build("Two Text Fields Demo").default_close_operation = JFrame::EXIT_ON_CLOSE<p>def text_action(type, event)</p><br></br> puts "EVENT: #{type} #{event.action_command}"<br></br>end请点击上面的链接查看更多的示例代码。

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

menu_bar {<br></br> menu('File') {<br></br> mnemonic :VK_F<br></br> menu_item('Exit') {<br></br> mnemonic :VK_X<br></br> on_click { @frame.dispose }<br></br> }<br></br> }<br></br>}这段示例代码则向我们展示了如何使用 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'<p>class HelloWorldModel</p><br></br> attr_accessor :saying<br></br>end<br></br>model = HelloWorldModel.new<br></br>model.saying = "Hello World"<p>Frame {</p><br></br> title "Hello World F3"<br></br>  width 200<br></br> content {<br></br> Label {<br></br> text bind(model,:saying)<br></br> }<br></br> }<br></br> visible true<br></br>}这几套 API 到底哪一套更加合乎人们的口味呢?这还有待观察。 Swing XML GUI 定义类库现在已经俯拾皆是了,而且我们的视线中越来越多新的相似类库接踵而来。与它们的区别则是,JRuby 的类库一般来说块头都非常小,目前在 Profligacy 的例子里只有 200 行代码,并且还不存在对第三方类库的依赖。这就使得这些类库非常容易理解和维护。此外,由于这些类库全都允许在 Ruby 中编写 GUI 定义,它们扩展起来同样也要容易得多。如果有哪些组件的特性或者组合还没有得到支持,我们也可能退回只处理 Swing 对象的步骤上去,而不必去请求类库的维护者添加一项新特性了。

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

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

2007-07-06 09:301533
用户头像

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

关注

评论

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

【架构学习10】——毕业总结

tiger

架构实战营

区间合并算法

工程师日月

算法 5月月更

面试突击47:死锁产生的原因有哪些?

王磊

Java 面试 java面试

赵海鹏:如何进行OpenHarmony音频特性架构设计和开发工作

OpenHarmony开发者

OpenHarmony 开发者故事 开发者说

姐姐驾到 | 零基础小白如何学前端!

锋享前端

『Python』题集⒋

謓泽

Python 5月月更

C语言_标准时间与秒单位的转换

DS小龙哥

5月月更

网站开发进阶(五十四)jQuery获取父级元素、子级元素、兄弟元素方法汇总

No Silver Bullet

JQuery框架 5月月更

来自2022年的Python 网络爬虫补充知识,HTML+JSON+爬虫场景

梦想橡皮擦

5月月更

趣学设计模式-代理模式

ZuccRoger

5月月更

极狐GitLab入驻阿里云计算巢,共同提升云上开发体验

阿里云弹性计算

DevOps 计算巢

为了让女朋友运动起来,小伙儿不仅买单车还设计了智能防盗单车锁

华为云开发者联盟

stm32 华为云IoT 智能防盗单车锁 蓝牙

YUV数据分析

Loken

音视频 5月月更

ptrace注入分析

小道安全

明道云入选爱分析2022年两份低代码研究报告

明道云

共同推动基础软件根技术发展,华为与中国软件行业协会签署战略合作协议

科技热闻

SAP 订单模型的编排方式概述

汪子熙

订单管理 订单 5月月更 b2b 编排系统

druid源码学习一

Nick

源码 Druid

5 月 20 日,API 网关 Apache APISIX Summit ASIA 2022 重磅来袭

API7.ai 技术团队

开源 API网关 Apache APISIX APISIX 网关 APISIX Summit

沙利文发布《2021年中国数据库市场报告》:中国分布式数据库2021专利占全球76%

科技热闻

数据湖揭秘—Delta Lake

阿里云大数据AI技术

sql spark 分布式计算 关系型数据库 存储

Druid连接池源码阅读01

石小天

kubernetes下的Nginx加Tomcat三部曲之三

程序员欣宸

Java Kubernetes 5月月更

【架构学习09】——电商秒杀系统

tiger

架构实战营

互联网用户画像,精准营销,数仓有妙招

华为云开发者联盟

位图 GaussDB(DWS) 用户画像 精准营销 Roaringbitmap

数据库连接池-Druid 源码学习(一)

wjchenge

初始化 Druid 源码、

【ELT.ZIP】OpenHarmony啃论文俱乐部——大数据框架性能优化系统

ELT.ZIP

大数据 OpenHarmony 压缩算法 ELT.ZIP

【LeetCode】乘积小于 K 的子数组Java题解

Albert

LeetCode 5月月更

GaussDB(for Influx)与开源企业版性能对比

华为云开发者联盟

数据库 开源 查询 写入 GaussDB(for Influx)

位运算小妙招-求二进制序列中1的个数

芒果酱

c++ C语言 5月月更

【ELT.ZIP】OpenHarmony啃论文俱乐部——云计算数据压缩方案

ELT.ZIP

云计算 OpenHarmony 数据压缩 ELT.ZIP

JRuby GUI API三剑客_Java_Werner Schuster_InfoQ精选文章