2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

关注

评论

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

Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理

sysin

Infoblox

判别式 AI 与生成式 AI

量贩潮汐·WholesaleTide

人工智能

AlmaLinux 10 x86_64 OVF (sysin) - VMware 虚拟机模板

sysin

AlmaLinux

Rocky Linux 10 - RHEL 100% 1:1 兼容免费发行版

sysin

Rocky Linux

Oracle Linux 10 - Oracle 提供支持 RHEL 兼容发行版

sysin

oracle

Metasploit Pro 4.22.7-2025052201 (Linux, Windows) - 专业渗透测试框架

sysin

Metasploit

AppSpider 7.5.018 for Windows - Web 应用程序安全测试

sysin

AppSpider

科学智能新篇章:国际科学智能联盟在京成立,开启“大科研时代”

ModelWhale

科学智能 AI4S 国际科学智能联盟

贝锐花生壳内网穿透:高速远程访问绿联NAS和Docker应用

贝锐

内网穿透 NAS Docker 镜像

【CodeBuddy】三分钟开发一个实用小功能之:爆炸式模态框弹出

jimaks

CSS

Nexpose 8.8.0 for Linux & Windows - 漏洞扫描

sysin

Nexpose

BeeWorks局域网聊天工具:打造智能高效的企业级即时通讯新生态

BeeWorks

AI应用如何不被淘汰?深耕RAG与数据底座是关键

E科讯

Red Hat Enterprise Linux 10 正式版发布,主打在混合环境中提供更强大的智能与安全能力

sysin

RHEL

为何PostgreSQL没有聚集索引?解读两大数据库的设计差异

电子尖叫食人鱼

数据库

Rocky Linux 10 x86_64 OVF (sysin) - VMware 虚拟机模板

sysin

Rocky Linux

多图框CAD图纸如何快速导出?快试试导出多页PDF功能

在路上

cad cad看图 CAD看图王

《算法导论(第4版)》阅读笔记:p115-p126

codists

算法

CAD标注样式如何设置?详细教程来了

在路上

cad cad看图 CAD看图王

案例分享 | 银行如何构建动态闭环安全防护体系?塞讯验证带你看

塞讯科技

网络安全 银行 安全运营 安全验证

Redis配置文件详解

不在线第一只蜗牛

redis

Flawnter 5.9.1 (macOS, Linux, Windows) - 应用程序安全测试软件

sysin

安全测试

Immunity CANVAS Professional 7.27 (macOS, Linux, Windows) - 渗透测试和漏洞利用平台

sysin

漏洞利用

【多线程】Java多线程与并发编程全解析

不在线第一只蜗牛

Java

Rocky Linux 10 aarch64 OVF (sysin) - Apple silicon VMware 虚拟机模板

sysin

Rocky Linux

GNS3 v3.0.5 - 开源免费网络模拟器

sysin

网络模拟器

Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统

sysin

Arista

MIAOYUN受邀参加“创投天府·周周见”活动,以AI原生技术赋能科创产业新生态

MIAOYUN

AI 云原生 投融资 创投活动 创投天府

三问业务数据化与数据业务化

优秀

数字化 业务数据化 数据业务化

好端端的线程池,怎么就卡死了?

电子尖叫食人鱼

Python Linux 线程池

AlmaLinux 10 - RHEL 二进制兼容免费发行版

sysin

AlmaLinux

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