Luaj学习笔记(三) - LuaJ创建AWT窗体的应用示例

4 篇文章 1 订阅

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……最后,七夕快乐

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿长大人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值