用JRuby+CSS开发跨手机平台的云应用

开发第一个HTMLMlet

新型交互面板HTMLMlet,继承J2SE的JPanel,遵循J2SE的界面开发方法,通过API为JComponent设置CSS,以获得CSS强大展示,实例化时,服务器将其转换为手机端所需的HTML5+JavaScript+CSS,并将用户响应转换为J2SE的Event,驱动JComponent侦听器。

因此,仅需关注业务界面构造和事件响应,其它则全部交与容器。

以下我们通过三步,用JRuby来实现如下图所示的可运行于iPhone和Android的云应用。

打开服务器端的"设计器",如果没有安装,请参阅"附录-安装开发环境"。

1. 添加一个HTMLMlet的菜单项

点击工具条中的"Add Item"按钮后,显示如下:

选中"form",点击"下页":

选中"HTMLMlet",点击"确认"。

将"Display Name"改为"HTMLMlet","Target Locator"改为"MyHTMLMlet"。

粘贴如下代码到"JRuby Script"区。(注意:按钮图片通过网络加载,实际应用时,可存放在jar内,以免网络迟延或故障)

#encoding:utf-8

import javax.swing.JButton
import javax.swing.JTextArea
import javax.swing.JPanel
import java.awt.BorderLayout
import java.awt.GridLayout
import javax.swing.ImageIcon
import java.net.URL
import java.awt.Dimension
import javax.imageio.ImageIO
import javax.swing.SwingConstants
import Java::hc.server.ui.ProjectContext

class MyHTMLMlet < Java::hc.server.ui.HTMLMlet
    def initialize
        super #invoke super construct method

        @area = JTextArea.new()
        @btn_light = JButton.new()
        @btn_switch = JButton.new()
        @icon_press_on = ImageIcon.new(ImageIO.read(URL.new("http://homecenter.mobi/images/press_on_64.png")))#Note : you should store png in a jar
        @icon_press_off = ImageIcon.new(ImageIO.read(URL.new("http://homecenter.mobi/images/press_off_64.png")))

        @context = getProjectContext()

        @icon_light_on = ImageIcon.new(ImageIO.read(URL.new("http://homecenter.mobi/images/light_on_64.png")))
        @icon_light_off = ImageIcon.new(ImageIO.read(URL.new("http://homecenter.mobi/images/light_off_64.png")))

        @isLightOn = false
        @btn_switch.setIcon(@icon_press_off)
        @btn_light.setIcon(@icon_light_off)

        setCSS(@btn_switch, "iconStyle", nil)#iconStyle is defined "CSS Styles" and is automatically loaded for all HTMLMlet in current project
        setCSS(@btn_light, "iconStyle", nil)

        cssStyle = ".areaStyle{width:100%;height:100%;font-size:" + getFontSizeForNormal().to_s() + "px;color:green}"
        loadCSS(cssStyle)
        setCSS(@area, "areaStyle", nil)#areaStyel is defined cssStyle string.
        #it equals with setCSS(@area, nil, "width:100%;height:100%;font-size:" + getFontSizeForNormal().to_s() + "px;color:green")
        @area.setEditable(false)

        lightPanel = JPanel.new
        lightPanel.setLayout(GridLayout.new(1, 2))
        lightPanel.add(@btn_light)
        lightPanel.add(@btn_switch)

        @btn_switch.addActionListener{|e|
            @area.append("click switch\n")
            @isLightOn = !@isLightOn
            if @isLightOn
                @context.sendMovingMsg("light on")
                @btn_switch.setIcon(@icon_press_on)
                @btn_light.setIcon(@icon_light_on)
            else
                @context.sendMovingMsg("light off")
                @btn_switch.setIcon(@icon_press_off)
                @btn_light.setIcon(@icon_light_off)
            end
        }

        buttonPanel = JPanel.new()
        buttonPanel.setLayout(GridLayout.new(1, 2))
        buttonPanel.setPreferredSize(Dimension.new(@context.getMobileWidth(), getButtonHeight()))

        button = JButton.new("Screen")
        setCSS(button, "btnStyle", nil)
        button.addActionListener{|e|
            go(Java::hc.server.ui.Mlet::URL_SCREEN)#open desktop and control remote screen.
        }
        buttonPanel.add(button)

        button = JButton.new("Back")
        setCSS(button, "btnStyle", nil)
        button.addActionListener{|e|
            back()#exit and return back
        }
        buttonPanel.add(button)

        setLayout(BorderLayout.new())
        add(lightPanel, BorderLayout::NORTH)
        add(@area, BorderLayout::CENTER)
        add(buttonPanel, BorderLayout::SOUTH)

        setCSS(self, nil, "background-color:white;")#override the default color styles.
    end

    #override empty method onStart
    def onStart
        @area.append("Sys call onStart\n")
    end

    #override empty method onPause
    def onPause
        @area.append("Sys call onPause\n")
    end

    #override empty method onResume
    def onResume
        @area.append("Sys call onResume\n")
    end

    #override empty method onExit
    def onExit
        @context.tipOnTray("Sys call onExit")
    end
end

return MyHTMLMlet.new

2. 设置全局CSS

点击左侧树的Resources/CSS Styles,将下面CSS粘贴到"Styles Edit Area"。

.iconStyle {
    text-align:center;
    vertical-align:middle;
    width:100%;
    height:100%;
}

.btnStyle {
    width:100%;
    height:100%;
    color:#fff;
    font-size:$buttonFontSize$px;
    background-color:#54a1d9;
    background-image:-webkit-gradient(linear, 0 0, 0 100%, color-stop(0, #8fc2e8), color-stop(0.5, #54a1d9), color-stop(0.5, #126aa9), color-stop(1, #2ddef2));
    -webkit-border-radius:9px;
    border:1px solid #377daf;
    -webkit-box-shadow:0 2px 4px rgba(46,185,230,0.7);
}

3. 发布应用

点击工具条中的"Activate"按钮,系统询问是否保存修改,点击"是",成功加载工程后,显示如下:

祝贺您,第一个HTMLMlet已就诸,通过手机,可以访问啦!

此时工程仅供您的手机访问,您的好友并不能下载并安装到他们自己的服务器上(除非您将自己服务器的帐号和密码告诉他们),将可供下载的网址复制到"MyFirst/Upgrade URL"输入框中,点击工具条中的"Save As",就可导出工程。(如果您已在"Developer Certificates"创建了证书,导出的同时进行签名)

将导出的har和had两文件上传,生成had的下载网址的二维码图片,好友即可扫描,安装到各自的服务器上了。

更多惊喜

  1. 如果您喜欢用JavaScript来实现手机端应用的特效,请参阅ScriptPanel组件。
  2. 通过语音助手API,响应手机的语音指令,实现更多神奇、有趣的应用场景。
  3. 内置HSQLDB小型数据库。
  4. 通过工具条上的"Demo"按钮,加载演示工程,它涵盖了80%以上的JRuby语法和90%以上的常用功能。
  5. 服务器内置Java 8 API文档和CSS 2.2文档,自动代码提示和API显示。
  6. HAR无需任何修改,便能运行于安卓平台上,因为安卓版使用了"J2SE for Android"开源包(如含有标准的jar库,会在安装时,转码成dex)。
  7. 关注、下载最新服务器源代码,请转至https://github.com/javalovercn/homecenter

附录-安装开发环境

  1. 确保已安装Java运行环境(Java Runtime Environment)或Java开发环境(Java SE Development Kit),没安装,从https://www.java.com/下载安装。
  2. 安装HomeCenter启动器,打开https://github.com/javalovercn/hc_server_dist,下载相应操作系统压缩包,比如Windows系统,则是"HC_Server_For_Win.zip"。
  3. 手机端下载(内含演示帐号),请打开https://github.com/javalovercn/client
  4. 解压包,双击可执行脚本。例如:Windows系统是"HomeCenter.bat";Mac系统则是"HomeCenter.command"。
  5. 启动器在运行时,会检查、下载最新的服务器内核。
  6. 下载成功后,系统显示软件使用许可协议对话框,点选"我同意"项,点击"同意"继续。
  7. 输入电子邮箱作为帐号。注:账号创建完后,并不能表明你是该邮箱的拥有者,稍后可进行邮箱验证。
  8. 服务器上线成功后,弹出如下信息:
  1. 初次安装,服务器会在后台下载JRuby引擎。JRuby引擎是一个jar包,约20M,下载校验后,系统提示如下:
  1. 祝贺您,现在可以开始编写第一个HAR工程了!(如果您是最终用户,且不需开发HAR,手机登录后,扫描好友或供应商的二维码以安装HAR工程包,即加即用。)
  2. 点击"确认",进入设计器,界面如下:
  1. 服务器的基本机理:服务器加载单元是HAR(Home Archive)工程包,采用jar格式封装应用的脚本、图标或所依赖的可执行jar。无需担忧如何发布工程包,点击"Save As"按钮即可完成HAR包的导出和签名。服务器既是运行容器,也是设计器,即HAR的开发环境(注:Android版的服务器除外,这是因为Android并不适合脚本编写,所以Android版仅供运行,而非开发。特别说明:此处的Android版为服务器端,而非手机端的Android版本)。HAR工程运行在JRuby解释器上。JRuby是采用纯Java实现的Ruby解释器,它结合了Ruby语言的简易性和功能强大的JVM的执行机制,包括与Java库全面集成。

注:本文引自https://github.com/javalovercn/homecenter/blob/master/docs/用J2SE+CSS开发跨手机平台的云应用.md,并稍加修改,版权归属原作者.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容