深入分析J2ME平台MIDP高级事件处理机制

深入解析J2ME超级玛丽游戏源代码 J2ME(Java 2 Platform, Micro Edition)是为嵌入式设备设计的一个Java平台,由Sun Microsystems公司于1999年推出。它源自早期的Java平台,专为有限资源的消费电子设备,如手机、PDA等,进行了特别的优化。J2ME的推出,让开发者能够用熟悉的Java语言为不同的移动设备创建应用程序和游戏。超级玛丽(Super Mario)是任天堂公司推出的一款经典的平台跳跃游戏,首次发行于1985年。 阅读详情

      MIDP中的事件处理机制在J2ME用户图形界面开发中具有举足轻重的地位,本文将深入分析MIDP高级事件处理机制,本文提供的程序是新手学习不错的例子。在接下来的文章我会继续讲述低级事件处理机制。

      MIDP的事件处理处理机制同样是采用回调的机制,你可以参考AWT的事件处理原理。在MIDP中分高级事件处理和低级事件处理,前者主要是针对高级UI,而后者主要是这对Canvas这样的低级UI的。不管怎样,我们必须首先介绍的是Command类,移动信息设备的输入主要来自于手机的键盘,导航则主要是由按钮来完成的,例如软键和导航键。Command类包装了动作的信息,但是并没有包括动作触发后应该做什么,这些是在CommanListener内实现的。看看Command的构造器吧
Command command = new Command("退出",Command.EXIT,1),构造器的参数分别表示按钮的标签,按钮的类型和优先级别。移动信息设备是根据后面两个参数对按钮进行布局的。

      高级事件处理主要由两个接口来实现,一个是CommandListener,一个是ItemStateListener。在CommandListener中定义了方法commandAction(Command cmd,Displayable disp),我们必须实现这个方法来完成事件处理,告诉应用程序当在disp界面下如果cmd按钮并按下的时候他应该去做什么。ItemStateListener中定义了方法itemStateChanged(Item item),应用程序通过他来得到在Form内的item内部状态发生变化的事件。用户在进行如下操作的时候都会触发这样的事件,调整交互性Guage、在TextField内输入或者修改内容、修改DateField、改变ChoiceGroup的状态。

      尽管我们已经通过上面的介绍了解了事件处理的机制,但是你会发现我们进行用户界面导航的时候仍然非常的麻烦,因为这不是在浏览器上开发界面,我们能做的只能是通过Command来进行处理。下面我将通过一个例子来说明如何使用CommandListener和ItemStateListener,这个例子有两个界面一个界面用来输入另一个用来显示用户的输入。在输入界面如果我们选择click这个ChoiceGroup,界面会出现另外一个文本输入,如果我们不选择他就不会出现。在这样一个程序中充分说明了如何使用上述两个接口来完成MIDP高级事件的处理,但是也暴露出了导航难得问题,在以后的文章中我会介绍如何使用MVC的设计模式来解决这个问题。下面是程序执行的界面抓图


程序源代码如下所示:

//HighLevelMIDlet.java
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
/*
 * Created on 2004-6-24
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author P2800
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class HighLevelMIDlet extends MIDlet
{

    private Display display;
    private MainUI mainUI;
    private DisplayUI displayUI;
   
    /* (non-Javadoc)
     * @see javax.microedition.midlet.MIDlet#startApp()
     */
    protected void startApp() throws MIDletStateChangeException
    {
        // TODO Auto-generated method stub
        initMIDlet();

    }
   
    private void initMIDlet()
    {
        display = Display.getDisplay(this);
        mainUI = new MainUI(this);
        displayUI = new DisplayUI(this,mainUI);
        display.setCurrent(mainUI);
    }
   
    public DisplayUI getDisplayUI()
    {
        return displayUI;
    }
    public Display getDisplay()
    {
        return display;
    }

    /* (non-Javadoc)
     * @see javax.microedition.midlet.MIDlet#pauseApp()
     */
    protected void pauseApp()
    {
        // TODO Auto-generated method stub

    }

    /* (non-Javadoc)
     * @see javax.microedition.midlet.MIDlet#destroyApp(boolean)
     */
    protected void destroyApp(boolean arg0) throws MIDletStateChangeException
    {
        // TODO Auto-generated method stub

    }

}
//MainUI.java

import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.ChoiceGroup;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.ItemStateListener;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;

/*
 * Created on 2004-6-24
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author P2800
 *
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
public class MainUI extends Form implements CommandListener, ItemStateListener
{

    private HighLevelMIDlet midlet;
    private TextField inputField;
    private ChoiceGroup choice;
    private TextField inputField2;
    private int index;
    public static final Command cmd = new Command("Display", Command.ITEM, 2);

    public MainUI(HighLevelMIDlet midlet)
    {
        super("form");
        this.midlet = midlet;
        init();
    }

    public void init()
    {
       
        inputField = new TextField("Input", null, 25, TextField.ANY);
        inputField2 = new TextField("Input2", null, 25, TextField.ANY);
        choice = new ChoiceGroup("click", Choice.MULTIPLE);
        choice.append("Another", null);
        this.append(inputField);
        this.append(choice);
        this.addCommand(cmd);
        this.setCommandListener(this);
        this.setItemStateListener(this);

    }

    /*
     * (non-Javadoc)
     *
     * @see javax.microedition.lcdui.CommandListener#commandAction(javax.microedition.lcdui.Command,
     *      javax.microedition.lcdui.Displayable)
     */
    public void commandAction(Command arg0, Displayable arg1)
    {
        // TODO Auto-generated method stub
        if(arg0 == cmd)
        {
            String input = inputField.getString();
            System.out.println(input);
            midlet.getDisplayUI().setInput(input);
            midlet.getDisplay().setCurrent(midlet.getDisplayUI());
           
        }

    }

    /*
     * (non-Javadoc)
     *
     * @see javax.microedition.lcdui.ItemStateListener#itemStateChanged(javax.microedition.lcdui.Item)
     */
    public void itemStateChanged(Item arg0)
    {
        // TODO Auto-generated method stub
        if(arg0 == choice)
        {
           
            if(choice.isSelected(0) == true)
            {
                index = this.append(inputField2);
            }
            else
            {
                this.delete(index);
            }
        }

    }

}
//DisplayUI.java

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.StringItem;


/*
 * Created on 2004-6-24
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author P2800
 *
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
public class DisplayUI extends Form implements CommandListener
{

    private HighLevelMIDlet midlet;
    private StringItem displayItem;
    private Displayable backUI;
    public static final Command backCommand = new Command("Back", Command.BACK,
            2);

    public DisplayUI(HighLevelMIDlet midlet,Displayable backUI)
    {
        super("Display");
        this.midlet = midlet;
        this.backUI = backUI;
        init();
        this.addCommand(backCommand);
        this.setCommandListener(this);
    }

    private void init()
    {
        displayItem = new StringItem("you input", null);
        this.append(displayItem);
    }
   
    public void setInput(String input)
    {
        displayItem.setText(input);
    }
    /*
     * (non-Javadoc)
     *
     * @see javax.microedition.lcdui.CommandListener#commandAction(javax.microedition.lcdui.Command,
     *      javax.microedition.lcdui.Displayable)
     */
    public void commandAction(Command arg0, Displayable arg1)
    {
        // TODO Auto-generated method stub
        if(arg0 == backCommand)
        {
            midlet.getDisplay().setCurrent(backUI);
        }

    }

}

代号OneNET02 STM32+ESP8266 WIFI系列-第2节-STM32单片机通过ESP8266连接WIFI访问OneNET OTA服务器实现SOTA远程程序升级 第2节-STM32单片机通过ESP8266连接WIFI访问OneNET OTA服务器实现SOTA远程程序升级,这一节主要是实现通过OneNET OTA服务器将需要更新的程序远程下载到STM32单片机,这一节主要是引导程序和应用程序的讲解。 阅读详情

相关推荐

思科模拟器PT8.2实战:用MQTT协议搭建智能家居控制原型(附完整代码)

本文详细介绍了如何在思科模拟器Packet Tracer 8.2中,利用MQTT协议构建一个智能家居灯光控制原型。从环境准备、拓扑设计到MQTT代理配置,手把手指导您完成发布者与订阅者的Python代码编写,实现开关对LED的远程控制。通过此实战项目,您将深入理解MQTT协议在物联网中的核心应用,掌握从理论到实践的完整开发流程。

weixin_29281941的博客 361

AWT的语义事件和低级事件

AWT将事件分为低级(low-level)事件和语义(semantic)事件。语义事件是表示用户动作的事件,例如,点击按钮;因此,ActionEvent是一种语义事件。低级事件是形成那些事件的事件。在点击按钮时,包含了按下鼠标、连续移动鼠标、抬起鼠标(只有鼠标在按钮区中抬起才引发

银月 2503

IC版图设计之OASIS文件格式详解

OASIS(Open Artwork System Interchange Standard)是继GDSII之后新一代的集成电路版图数据交换标准,由SEMI在2004年正式发布(SEMI标准号:SEMI P39)。高压缩率:相比GDSII可减少3-10倍文件体积扩展性强:支持纳米级工艺的复杂图形描述跨平台兼容:独立于EDA工具和操作系统安全增强:内置校验和与加密支持。

ZZcppc的博客 2448

如何清空界面的内容

import javax.microedition.midlet.*;import javax.microedition.lcdui.*;public class NotifyDemo extends MIDlet implements CommandListener{ Display display; Form form; Command exitCommand; C

HaiyuKing的专栏 722

【参数不确定】敏感性分析(sensitivity analysis)

【运筹学】灵敏性分析

羊肉蛋花汤的博客 14万+

手把手教你学Simulink--基于储能系统的建模与仿真场景:-锂电池储能系统充放电管理策略仿真

《锂电池储能系统充放电管理的Simulink建模与仿真》摘要 本文详细介绍了使用Simulink+SimscapeElectrical对锂电池储能系统进行充放电管理策略建模的全过程。从系统结构设计入手,重点阐述了锂电池模型、充放电控制器、热管理系统等核心模块的搭建方法,并提供了完整的仿真流程。文章详细说明了如何实现荷电状态管理、温度控制和功率限制等关键策略,通过仿真分析了电池电压、电流、SoC和温度等关键指标的变化规律。最后提出了基于仿真结果的优化建议,包括参数整定、算法改进等方面,为锂电池储能系统的安全高

MHD0815的博客 1万+

java j2me 保存捕获的音频

importjavax.microedition.lcdui.Alert;importjavax.microedition.lcdui.Command;importjavax.microedition.lcdui.CommandListener;importjavax.microedition.lcdui.Display;importjavax.microedition.lcdui.D...

张天疯的专栏 134

组态王的日历时间控件脚本

日期时间控件中的脚本中在小于10的月份和天数前必须要加上0,这是由首字符对比机制规定的,首字母相同,就不再不做对比了,比如1和11,是一样的。首字母不同,再比较下一位。 float Ayear1; float Amonth1; float Aday1; string temp1; Ayear1=sd.Year; Amonth1=sd.Month; Aday1=sd.Day; temp1=StrFromInt( Ayear1, 10 ); if(Amonth1<10) temp1=temp1+"-0"+

逍遥子的博客 5718

深入分析J2ME平台MIDP低级事件处理机制

原文:http://javaeye.5d6d.com/thread-90-1-1.html 深入分析J2ME平台MIDP低级事件处理机制  通常低级事件的处理是为了满足游戏开发的需要,因为游戏开发相关的问题非常复杂。因此不在这里进行阐述,有兴趣的朋友可以和我索要相关的游戏开发资料。MIDP定义了如下键值在Canvas类内:    KEY_NUM0  KEY_NUM1  KEY_NUM2  KE

无花专栏--http://www.ucweb.com 952

为什么 ChatGPT 生成的下载地址会长成 sky-metal-cards-jerry.quirkypony34.chatgpt.site 这种奇怪的样子

我今天看到的这条地址,确实很容易让人产生一种感觉,ChatGPT 明明只是生成了几张 PNG 图片和一个压缩包,为什么最终拿到的却不是类似这种看起来很正规的下载链接,而是一长串带有、UUID、apidecks的地址。更容易让人疑惑的是,其中还出现了一个平时很少见到的域名。这并不是浏览器随机生成的临时 URL,也不是某个来历不明的第三方文件服务器。根据 OpenAI 在 2026 年公布的 ChatGPT Sites 文档和相关服务条款,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 65

2026年03月CCF-GESP编程能力等级认证C++编程一级真题解析

本文收录于专栏《。订阅后可阅读专栏内所有文章。

人生就是一个不断学习的过程 342

本人编写的《J2ME开发精解》已经由电子工业出版社出版

J2ME开发网站长詹建飞编写的《J2ME开发精解》一书已经陆续在各个书店和网上书店上架,本书由电子工业出版社出版,SUN中国技术社区推荐java用书。目录如下:J2ME开发精解詹建飞 编著2006年1月出版ISBN 7-121-02210-949.00元(含光盘1张)416页 内容简介本书介绍如何在支持J2ME的设备上开发MIDP应用程序,尤其针对MIDP

mingjava的专栏 5502

自然语言处理:长文本场景下的关键词抽取实践

自然语言处理:长文本场景下的关键词抽取实践

丨汀、的博客 2077

分析MIDP的高级事件处理机制

作者:mingjava  文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=21MIDP中的事件处理机制在J2ME用户图形界面开发中具有举足轻重的地位,本文将深入分析MIDP高级事件处理机制,本文提供的程序是新手学习不错的例子。在接下来的文章我会继续讲述低级事件处理机制。    MIDP的事件处理处理机制同样是采用回调的机制

mobilechannel的专栏 706

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

(按键)深入分析J2ME平台MIDP低级事件处理机制

通常低级事件的处理是为了满足游戏开发的需要,因为游戏开发相关的问题非常复杂。因此不在这里进行阐述,有兴趣的朋友可以和我索要相关的游戏开发资料。MIDP定义了如下键值在Canvas类内:   KEY_NUM0   KEY_NUM1   KEY_NUM2   KEY_NUM3   KEY_NUM4   KEY_NUM5   KEY_NUM6   KEY_NUM7   KEY_NUM8

alleniversoncomputer的专栏 488

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

BREW & J2ME:在差别中联合

[出自: http://expert.imobile.com.cn]摘要 本系列面向那些习惯使用J2ME的手机开发者,或者那些对更轻便和更有效的代码生成感兴趣的BREW开发者。主要是受Java GUI模型的启发,当前的BREW_J2ME 框架可以处理J2ME中当作“高级别接口”的东西。关于如何提供确切的J2ME匹配-推理不在本文讨论范围之内,本文只是提供这两个领域的概述。 首先我将快速讨论BR

mobilechannel的专栏 5674

J2ME浅说

[u][i][b]1.J2ME采用模块化的结构[/b][/i][/u] 底层是宿主机的操作系统,内部则分为三层, Java Virtual Machine(虚拟机层); Configuration(配置层); Profile(简表层)。J2ME有两类虛拟机:CVM(C虚拟机)和KVM(K虚拟机), CVM功能比KVM功能更为强大; Configuration层:Configuration是J2M...

ittime 206

Record Management System从入门到精通系列之一

      Record Management System是J2ME的一个重要的子系统,目的是实现应用程序本地数据的持久性存储。目前支持文件系统的移动信息设备还有限,因此Record Management System是J2ME开发人员实现本地数据存储的首选途径。本文的目的就是全面的介绍Record Management System的知识。       顾名思义Record Managemen

mingjava的专栏 6563

RMS从入门到精通之一

 Record Management System是J2ME的一个重要的子系统,目的是实现应用程序本地数据的持久性存储。目前支持文件系统的移动信息设备还有限,因此Record Management System是J2ME开发人员实现本地数据存储的首选途径。本文的目的就是全面的介绍Record Management System的知识。      顾名思义Record Management Syst

!Java 2509
上一篇: 今天你java了吗?
下一篇: java程序员测试——你了解J2ME平台嘛?
mingjava
博客等级 码龄24年 68粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值