快速业务通道

Java.next:第二部分——与Java的互操作 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
almost right, see below) import javax.swing._ import java.awt.event.{ActionEvent, ActionListener} object HelloWorld extends JFrame("Hello Swing") {   def showButtonMessage(msg: String) =    JOptionPane.showMessageDialog(null, String.format("""<html>Hello from <b>Scala</b>. Button %s pressed""", Array(msg)));   def main(args: Array[String]) {    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)    val button = new JButton("Click Me")    button.addActionListener((e:ActionEvent) => showButtonMessage(e.getActionCommand.toString))    getContentPane add button    pack    setVisible(true)   } }

Scala版本与Groovy相对Java具有许多相同的优点:

◇ 更少的类型声明

◇ 更少的分号

◇ 更少的括号

我们还可以看到Scala独有的一些性质:

◇ 在Scala中import通配符是_而不是熟悉的*。*号具有其它意义

◇ Scala能够单行引入同一个package中的多个class

◇ 因为我们只需要一个实例,所以我们用object声明而不是class

◇ 该object继承了JFrame,Scala允许我们使用内嵌的方式调用JFrame的构造函数,而不必再单独声明一个构造函数

Java.next:第二部分——与Java的互操作(3)

时间:2011-01-29 yeeyan 译: 梦幻泡影露电

与Groovy一样,最大的不同是事件******。Scala同样允许我们简单的传入一个匿名函数,而不需要使用匿名内部类。

button.addActionListener((e:ActionEvent) =>   showButtonMessage(e.getActionCommand.toString))

看起来很强大,只不过这儿我做了一个小小的弊。Scala是强类型语言,它不会自动将一个函数类型转换为一个ActionListener。因此上面的代码还不能被编译通过。幸运的是,Scala的隐式转换功能让我们拥有这个能力:强类型加上一个便利的类型系统。所有我们要做的是告诉Scala这个转换是合法的:

// Yes, we can implicit def actionPerformedWrapper(func: (ActionEvent) => Unit) =   new ActionListener { def actionPerformed(e:ActionEvent) = func(e) }

将上面的代码放到适当的位置,我们就能够在需要ActionListener的地方传入一个函数。

已经有多个将Swing包装为Scala的项目。使用这些库,你能够书写更加简洁的代码。作为示例,你可以参看ScalaGUI。

JRuby的实现

现在来看看JRuby的情形:

include Java import javax.swing.JFrame import javax.swing.JButton import javax.swing.JOptionPane import java.awt.event.ActionListener button = JButton.new "Click Me" button.add_action_listener do |evt|   JOptionPane.showMessageDialog(nil, <<-END) <html>Hello from <b>JRuby</b>. Button ''#{evt.getActionCommand()}'' clicked. END end frame = JFrame.new "Hello Swing" frame.content_pane.add button frame.default_close_operation = JFrame::EXIT_ON_CLOSE frame.pack frame.visible = true

如果与之前Groovy的代码进行对比,你会发现它们几乎具有相同的特点:

◇ 更少的类型声明

◇ 更少的分号

◇ 更少的括号

◇ 简洁的属性访问(没有getter与setter)

◇ 多行字符串(使用END界定)

◇ 使用${}往字符串里插入it.actionCommand

相比而言,JRuby的ActionListener实现比Groovy稍微简单一点。JRuby能够自动根据block生成ActionListener:

button.add_action_listener { |evt|   # do stuff }

Java.next:第二部分——与Java的互操作(4)

时间:2011-01-29 yeeyan 译: 梦

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号