Luaj学习笔记(三) - LuaJ创建AWT窗体的应用示例
项目文件结构
项目目录结构如下:
入口程序
命名为Test.java的Java程序文件。
package pers.landriesnidis.testluaj;
import org.luaj.vm2.Globals;
import org.luaj.vm2.lib.jse.JsePlatform;
public class Test {
public static void main(String[] args) {
//lua脚本文件所在路径
String luaPath = "script/test.lua";
Globals globals = JsePlatform.standardGlobals();
//加载脚本文件script/test.lua,并编译
globals.loadfile(luaPath).call();
}
}
宠物狗类
名称为Dog.java的Java类,包含了简单的三个方法。
package pers.landriesnidis.testluaj;
public class Dog {
private String name; // 狗名
private double weight = 0.3; // 体重
private float hunger = 0.5f; // 饥饿度
public Dog() {}
public Dog(String name) {this.name = name;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String eat(){
if(hunger>0.9){
return String.format("%s已经很饱了,快带它运动一下吧~", this.name);
}else{
this.weight *= 1.2; // 体重增加
this.hunger *= 1.35; // 感觉饱了一点
return String.format("%s对着食盆大快朵颐一番……“汪~” %s表示%s.", this.name, this.name, hunger>0.6?"已经吃饱饱啦":"它还能再吃一点");
}
}
public String play(){
if(hunger>0.2){
this.weight *= 0.9; // 消化积食
this.hunger *= 0.6; // 感觉饿了一点
return String.format("%s和你酣畅淋漓的玩了一场丢球游戏~", this.name);
}else{
return String.format("%s蔫儿巴巴的,小肚肚也瘪瘪的,要吃饱了才能陪你玩呐~", this.name);
}
}
public String getInfo(){
return String.format("\t-----狗狗信息-----\n\t 狗狗名字:%s\n\t 体重:%.2fkg\n\t 饥饿度:%.1f%%\n\t------------------", this.name,this.weight,this.hunger*100);
}
}
Lua脚本
名称为test.lua的Lua脚本文件。
--创建一个Dog的实例
dog = luajava.newInstance("pers.landriesnidis.testluaj.Dog","Jack")
--创建并设置窗体中的控件元素
frame = luajava.newInstance("java.awt.Frame", "My Pet : " ..dog:getName())
console = luajava.newInstance("java.awt.TextArea")
buttons_pn = luajava.newInstance("java.awt.Panel")
Button = luajava.bindClass("java.awt.Button")
eat_bt = Button.new("Eat")
play_bt = Button.new("Play")
info_bt = Button.new("Info")
exit_bt = Button.new("Exit")
frame:setSize(600,300)
buttons_pn:add(eat_bt)
buttons_pn:add(play_bt)
buttons_pn:add(info_bt)
buttons_pn:add(exit_bt)
BorderLayout = luajava.bindClass("java.awt.BorderLayout")
frame:add(BorderLayout.NORTH, console)
frame:add(BorderLayout.SOUTH, buttons_pn)
frame:pack()
frame:show()
--
--eat按钮
--
--实现eat按钮的回调方法
eat_cb = {
actionPerformed = function(ev)
msg = dog:eat()
print(msg)
console:setText(msg)
end
}
--eat按钮事件的代理(实现了方法的接口对象)
eat_jproxy = luajava.createProxy("java.awt.event.ActionListener",eat_cb)
--为按钮添加动作监听器
eat_bt:addActionListener(eat_jproxy)
--
--play按钮
--
play_cb = {
actionPerformed= function (ev)
msg = dog:play()
print(msg)
console:setText(msg)
end
}
play_jproxy = luajava.createProxy("java.awt.event.ActionListener" ,play_cb)
play_bt:addActionListener(play_jproxy)
--
--info按钮
--
info_cb = {
actionPerformed= function (ev)
msg = dog:getInfo()
print(msg)
console:setText(msg)
end
}
info_jproxy = luajava.createProxy("java.awt.event.ActionListener" ,info_cb)
info_bt:addActionListener(info_jproxy)
--
--exit按钮
--
exit_cb = { actionPerformed=function (ev)
frame:setVisible(false)
frame:dispose()
end
}
exit_jproxy = luajava.createProxy("java.awt.event.ActionListener" ,exit_cb)
exit_bt:addActionListener(exit_jproxy)
--窗体事件监听
windows_cb = {}
function windows_cb.windowClosing(ev)
print("close")
frame:setVisible(false)
frame:dispose()
end
function windows_cb.windowActivated(ev)
print("act")
end
close_jproxy = luajava.createProxy("java.awt.event.WindowListener", windows_cb)
frame:addWindowListener(close_jproxy)
运行截图
窗体截图:
控制台:
结束语
Lua脚本中包含了对javalua库的应用,关于用法的详细解释可以参考我的上一篇文章《Luaj学习笔记(二) - 在Lua中操作Java对象》 。
emmm……最后,七夕快乐