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

原创 2004年06月24日 21:14:00

      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);
        }

    }

}

深入分析ClassLoader工作机制

//转载自【深入理解java web技术内幕】 ClassLoader类结构分析: 我们经常会用到或者扩展ClassLoader,主要会用到一下几个方法,以及他们的重载方法。 defineCla...
  • u010585120
  • u010585120
  • 2016年10月09日 16:57
  • 266

java 深入分析ClassLoader工作机制

ClassLoader顾名思义就是类加载器,负责将Class加载到JVM中,它就好比开会时 门口的接待员,负责给进入会场的嘉宾发放入会证明,入会的嘉宾分为VIP会员、黄金会 员、白金会员和普通会员等。...
  • qilixiang012
  • qilixiang012
  • 2014年11月02日 16:38
  • 1224

深入分析java web 技术内幕_笔记_六

深入分析classLoader工作机制 Classloader负责将Class加载到JVM中,并且确定由那个ClassLoader来加载(父优先的等级加载机制)。还有一个任务就是将Class字节码...
  • dac55300424
  • dac55300424
  • 2014年01月24日 15:56
  • 789

在J2ME/MIDP中实现图像旋转

摘 要 图形图像的旋转在移动应用程序开发,特别是游戏开发过程中有着现实的需求。但J2ME对此提供的支持却十分有限,如MIDP2.0仅支持图像成90度整数倍的旋转。针对这种情况, 本文提出了一种实现图像...
  • u013399592
  • u013399592
  • 2014年01月06日 17:32
  • 238

深入分析Java I/O 工作机制

这是一篇转载的文章,原文地址:http://blog.csdn.net/scythe666/article/details/51920698 IO是Java及众多编程语言很重要的一块,同时很多程序的...
  • DJJT10
  • DJJT10
  • 2016年12月26日 10:54
  • 176

J2ME及其移植

J2me及其移植   1. 简介 1.1 系统结构 Java ME 以往称作J2ME(Java Platform,Micro Edition),是为机顶盒、...
  • ydhua1988
  • ydhua1988
  • 2015年01月22日 09:22
  • 1168

深入分析ClassLoader工作机制

ClassLoader 较为深入分析。from 加载CLASS到JVM中,审查每个类应该由谁加载,父优先的等级加载机制。加载机制ClassLoader类结构分析ClassLoader抽象类,有很多子类...
  • Newpidian
  • Newpidian
  • 2016年12月10日 00:26
  • 2698

windows消息机制详解

1. 引言 Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛。 Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多...
  • u014041012
  • u014041012
  • 2015年04月09日 00:10
  • 1774

【代码】如何快速将J2me游戏移植到Android上

前言 小白:“老大,你让做的三个J2me游戏搞定了,请看DEMO。” 老大:“恩,不错,小白,你知道Android这个平台吧?” 小白:“恩,听过。听说和J2ME有很多共同点。” 老大:“(一阵奸...
  • u011884154
  • u011884154
  • 2013年09月11日 12:13
  • 1223

《深入分析Java web技术内幕》笔记

堆:所有对象实例都在Java堆上分配内存,堆大小由-Xmx和-Xms调节; 方法区:存放虚拟机加载类的相关信息,如类静态变量和常量; 栈:存放线程调用方法时,存储局部变量表、操作、方法出口等与方法执行...
  • Jlinglinglei
  • Jlinglinglei
  • 2016年04月28日 17:22
  • 905
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入分析J2ME平台MIDP高级事件处理机制
举报原因:
原因补充:

(最多只允许输入30个字)