你通常需要一个命令来进入Ruby和Java的联合世界:
| include Java |
这使你可以实例化Java类,调用其方法,甚至继承它们,就好象它们仅仅是普通的Ruby对象一样。但这其中有一些微妙的差异,这篇文章将向你展示如何管理它们以便能以最快的速度设计出新的应用并部署到你的客户那里。
这篇文章基于一个简单的应用,该应用使用JRuby和Swing实现了一个简单的ObjectSpace浏览器。Ruby的ObjectSpace特性提供了一种方式来访问系统中所有对象。例如,我们可以这样打印所有使用中的字符串:
| ObjectSpace.each_object(String) do |string| puts stringend |
当该程序在我的irb会话中运行时,大约会产生28000个字符串。通过使用Swing和JRuby,我们可以把不同的类显示在一个非常棒的图形界面上,包括它们的实例以及可用的方法。你甚至可以在最右边的面板中点击它们来调用无参的方法:
JRuby的ObjectSpace支持在默认情况下是被禁用的,这是由于它在运行时所产生的性能问题,当然还有其他原因。
我要指出它在实现中的一些有趣的细节,并就如何开始使用JRuby中的Java集成特性给出一些提示。
Java集成
一旦你将Java集成到脚本中,你就可以继承现有的Java类。我们只需要通过指定Java类的完整限定名就可以做到这一点。在这个例子应用中,主窗口继承了JFrame。该类中还包含进了javax.swing和java.awt包,所以你不必每次都使用类的全名。
| class MainWindow < javax.swing.JFrameinclude_package 'javax.swing'include_package 'java.awt' ... |
做为另外一种选择,你还可以使用include_class功能包含指定的类,这样就不会因你没有使用某些类,而污染了名称空间。
调用父类的构造方法就和普通的Ruby代码一样,这意味着我们可以在initialize方法的第一行通过调用super("JRuby Object Browser")来设定窗口的标题。
因为类包含了整个javax.swing包,所以实例化Java类就变得非常直接:
| list_panel = JPanel.newlist_panel.layout = GridLayout.new(0, 3) |
如果你仔细看看第二行,你可能会觉得我们直接访问了JPanel的layout属性,但事实并非如此。JRuby为Java对象增加了一些便捷的方法,所以上面的语句也可以用我们熟知的方式编写:
| list_panel.setLayout(GridLayout.new(0, 3)) |
不再使用getters和setters,看起来你可以直接访问属性。JRuby还向Java对象增加了更多的“语法糖”,这使得整个感觉更像Ruby了:对于任何方法调用,你可以使用snake_case符号而不是为任何方法调用而实际定义的camel case名。由此产生出调用setLayout方法的第三种方式:
| list_panel.set_layout(GridLayout.new(0, 3)) |
从类中调用setter方法时要小心,Ruby可能会认为你想创建一个局部变量,所以你必须以self作为接收者来显式地调用它:
| self.default_close_operation = WindowConstants::EXIT_ON_CLOSE |
Java和Ruby的另一个区别是对于常量的访问,像之前代码片断中的EXIT_ON_CLOSE。记住,当你将Java代码转化为Ruby时,要将所有的.访问符替换为::。
到目前为止,JRuby对于Swing开发所带来的变化看起来好像也没什么,但是我们尚未涉及到一个非常重要的方面:监听器。在Java中,将一个监听器与事件关联起来通常需要在一个匿名类中实现一个接口:
| button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ... } }); |
如果你想附加很多监听器时这很容易搞乱你的代码。在JRuby中,以下两行代码就能解决问题(如果你不使用event变量,你甚至可以忽略掉它):
| button.add_action_listener do |event| ... end |
这些是你使用JRuby开发Swing时需要掌握的基础。尽管JRuby使得用Swing开发GUI变得更方便,但是你还是需要手写很多代码,当需要复杂布局时更是如此。如果你希望能更简单地创建Swing UI时,请参考使用JRuby GUI APIs的三种方式。
相关专题
- Java环境安装配置 (5745篇文章)
- Java编程开发手册 (8416篇文章)
- Java应用开发篇 (1102篇文章)
- Java网络及通讯编程 (678篇文章)
- 在Eclipse中配置Struts2项目 (408次浏览)
- 在Spring中使用JTA事务管理 (252次浏览)
- 在Spring中使用Quartz进行任务调度 (161次浏览)
- 玩玩Spring之struts+hibernate+spring添删改 (158次浏览)
- 详细讲解在Spring中进行集成测试 (128次浏览)
- Java远程通讯可选技术及原理 (113次浏览)
- 用Java实现FTP批量大文件上传下载(二) (80次浏览)
- 在Spring中如何使用加密外部属性文件 (72次浏览)
- Java初学者必须理解的六个大问题 (69次浏览)
- 专家视点:Java能够替代C语言吗? (59次浏览)




