快速业务通道

探索JVM上的LISP - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
被禁用。

(define-namespace JFrame ) (define-namespace JButton ) (define-namespace ActionListener ) (define-namespace ActionEvent ) (define frame (make JFrame)) (define button (make JButton "Click only once")) (define action-listener   (object (ActionListener)    ((action-performed e :: ActionEvent) ::     (*:set-enabled button #f)))) (*:set-default-close-operation frame (JFrame:.EXIT_ON_CLOSE)) (*:add-action-listener button action-listener) (*:add frame button) (*:pack frame) (*:set-visible frame #t)

最初几行用define-namespace命令为将要用到的Java类定义缩略名,这同Java的import声明功能类似。

然后定义了frame和button,利用make函数可以创建Java对象。创建button时,我们提供一个字符串作为参数传给构造函数,Kawa可以很智能的将它翻译成需要的java.lang.String对象。

现在让我们跳过ActionListener的定义,先来看一下最后5行代码。这里的符号*:用于触发对象中的方法。例如,(*:add frame button)的功能就等同于frame.add(button)。你要注意到Scheme特有的,可以自动将方法名从Java中的骆驼拼写风格转换为小写的以连字符分隔单词。例如,set-default-close-operation将被转换为setDefaultCloseOperation。这里另外一个细节是:.可被用来访问静态域,(JFrame:.EXIT_ON_CLOSE)等同于JFrame.EXIT_ON_CLOSE。

现在来回头看一下ActionListener。这里用object函数创建了一个实现了java.awt.event.ActionListener接口的匿名类,action-performed函数被用来调用button上的setEnabled(false)方法。此时还需要添加些信息可以让编译器知道action-performed是ActionListener接口中定义的void actionPerformed(ActionEvent e)的实现。早先我们曾经说过,正常情况下在Scheme中并不需要类型,但是此时,当与Java协同工作时,编译器就需要多知道一些信息。

当你有了这两个文件后,编译SwingExample.java,并且确认将编译后的类和swing-app.scm文件放到类路径上,接下来就可运行java SwingExample来看看GUI的效果。你同样也可以用load函数: (load "swing-app.scm")在REPL中执行文件中的代码,这开启了动态操纵GUI构件的先河。例如,你可以通过在REPL中执行(*:set-text button "New text")来快速更改button上的文字,而且可以立即看到修改结果生效。

当然,这个例子只是想简单的演示如何从Kawa中调用Java,无论如何它都不是你能想象中的最优质的Scheme代码。如果你确实想要在Scheme中定义一个大型Swing UI,那你最好提升一点抽象级别,用一些精选的函数和宏来隐藏凌乱的整合代码。

关于作者

Per Jacobsson是位于洛杉矶的eHarmony.com的软件架构师,应用Java已有10年历史,近两年成为Lisp的狂热爱好者。你可以通过pjacobsson.com与他取得联系。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号