探索JVM上的LISP - 编程入门网
被禁用。
最初几行用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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |