写点什么

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:301563
用户头像

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

关注

评论

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

如何设计一个几十万在线用户弹幕系统

做梦都在改BUG

打破制造业数字化转型困境:华为云助力企业填补数据空白和简化管理

YG科技

InfluxDB vs TDengine,用数据“说”性能

TDengine

大数据 tdengine Influxdb 时序数据库 InfluxDB Cluster

一文详解 PoseiSwap,Nautilus Chain 上的首个 DEX

西柚子

css动若脱兔转换视差效果

格斗家不爱在外太空沉思

CSS 三周年连更

Groovy def关键字妙用

FunTester

浅谈离线数据倾斜

京东科技开发者

hive sql 数据倾斜 Spark java 企业号 4 月 PK 榜

JDK8到JDK17有哪些吸引人的新特性?

京东科技开发者

Java jdk8 jdk17 java 8 的新特性 企业号 4 月 PK 榜

华为云助力制造企业解锁数字化转型困局

YG科技

测试环境治理之MYSQL索引优化篇

京东科技开发者

MySQL 性能优化 测试环境 企业号 4 月 PK 榜

白活了!谷歌架构师10年心血汇成的《24种设计模式》,这才是正解

做梦都在改BUG

Java 设计模式

最近,我们做了一次“实景”容灾演练

云布道师

阿里云

IDEA导入多模块maven项目时部分模块未成功加载

redcoder54

IDEA springboot

国内服务器终于支持ChatGPT接入到公众号了

派大星

ChatGPT

阿里内部出品的这5份Java资料的含金量有多高,你不会还不知道吧

会踢球的程序源

Java 程序员 面试 java面试 构架师

Dock优化工具:HyperDock mac中文激活版

真大的脸盆

Mac Mac 软件 优化工具

剖析多利熊业务如何基于分布式架构实践稳定性建设

百度Geek说

分布式 稳定性 多利熊 企业号 4 月 PK 榜

华为云场景化解决方案 助力制造业企业数字化转型

YG科技

华为云数字化转型解决方案 助力制造业企业迈向智能化

YG科技

明修"栈"道——越过Android启动栈陷阱

vivo互联网技术

flag Activity启动 应用栈Task

深度学习基础5:交叉熵损失函数、MSE、CTC损失适用于字识别语音等序列问题、Balanced L1 Loss适用于目标检测

汀丶人工智能

人工智能 机器学习 深度学习 损失函数

网络编程懒人入门(十五):外行也能读懂的网络硬件设备功能原理速成

JackJiang

网络编程 即时通讯 IM

小白福利 | Window前言

GreatSQL

MySQL greatsql greatsql社区

前端面试题之性能优化大杂烩

肥晨

三周年连更

早有尔闻 | 低碳赋能,创新发展

Openlab_cosmoplat

工业互联网 开源社区

百度CTO王海峰做客《中国经济大讲堂》:文心一言,读书破万亿

飞桨PaddlePaddle

飞桨 文心一言

软件复杂度的思考与解决之道

阿里技术

技术成长 软件复杂度

Java如何实现手动连接数据库(mysql或oracle)|超级详细,建议收藏

bug菌

MySQL oracle 三周年连更

GitHub重磅上线!开源分布式架构原理设计笔记

小小怪下士

Java 程序员 分布式 分布式架构

Fabarta 获过亿元人民币 Pre-A 轮融资,打造面向 AI 的图智能 Infra

Fabarta

游戏内嵌社区服务开放,助力开发者提升玩家互动与留存

HarmonyOS SDK

HMS Core

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