应用MVC设计模式解决J2ME应用程序导航问题

原创 2004年06月29日 23:34:00

      开发MIDlet的程序员也许经常会被界面的导航问题所困扰,尤其界面比较多的时候,通常有七、八个界面就会很让人头疼了。本文讲述如何应用MVC设计模式解决这类的问题。

      MVC设计模式已经非常的成熟并在WEB Application的开发中广泛使用,apache的开源项目struts就是典型的例子。MVC的本质就是是逻辑和显示分开,通过控制器进行协调。通常我们会感到控制器比较的肥大,这个是个有争议的问题。MIDP的用户界面开发是比较简单的,只有那么20几个类。但是由于导航一般只能通过Command来实现,所以界面增多的情况下,如果没有有效的组织那么程序写起来非常的乱,最致命的是这样的程序可读性差、扩展性差、可维护性差。

      应用MVC解决这个问题的关键是提供一个桥梁作用的控制器,它通常要有一个MIDlet作为参数。例如    public UIController(PhoneBookMIDlet pbm)
    {
        this.phoneBookMIDlet = pbm;
    }
为了传递事件,你可以定义一个内部类,在里面定义事件的代号。这样用起来非常的方便例如
    public static class EventID
    {
        private EventID()
        {
        }

        public static final byte EVENT_NEW_RECORD_SELECTED = 1;
        public static final byte EVENT_SAVE_RECORD = 2;
        public static final byte EVENT_NEWPHONE_BACK_MAINUI = 3;
        public static final byte EVENT_LISTPHONE_BACK_MAINUI = 4;
        public static final byte EVENT_SEARCHUI_BACK_MAINNUI = 5;

        public static final byte ADD_NEW_RECORD = 100;
        public static final byte SEARCH_RECORD = 101;
        public static final byte CLEAR_RECORD = 102;
        public static final byte LIST_RECORD = 103;
        public static final byte HELP = 104;
    }我们要在这个控制器内初始化各个界面类,这样我们才能根据不同的事件代号进行导航。
public void init(Model model)
    {
        this.display = Display.getDisplay(phoneBookMIDlet);
        this.model = model;
        indexFunctionUI = new IndexFunctionUI(this);
        infomationUI = new InfomationUI();
        newPhoneUI = new NewPhoneUI(this);
        listPhoneUI = new ListPhoneUI(this);
        searchPhoneUI = new SearchPhoneUI(this);
        displayWelcome();
    }

    public void setCurrent(Displayable disp)
    {
        display.setCurrent(disp);
    }

    public void setCurrent(Alert alert, Displayable disp)
    {
        display.setCurrent(alert, disp);
    }由于本文主要讲述如何实现导航,因此关于Model不做任何介绍。细心的话你也许可以看出来我这些代码是在完成一个电话簿的功能。在从Record Management System从入门到精通之四中我会介绍自己编写的电话本。在控制器类中最重要的就是接受事件然后进行导航,也就是显示不通的界面。因此它的事件处理的方法是这样的。
public void handleEvent( int eventID)
    {
        switch (eventID)
        {
            case EventID.ADD_NEW_RECORD:
            {
                display.setCurrent(newPhoneUI);
                break;
            }
            case EventID.LIST_RECORD:
            {
                display.setCurrent(listPhoneUI);
                break;
            }
            case EventID.SEARCH_RECORD:
            {
                display.setCurrent(searchPhoneUI);
                break;
            }
            case EventID.EVENT_NEWPHONE_BACK_MAINUI:
            {
                display.setCurrent(indexFunctionUI);
                break;
            }
            case EventID.EVENT_LISTPHONE_BACK_MAINUI:
            {
                display.setCurrent(indexFunctionUI);
                break;
            }
            case EventID.EVENT_SEARCHUI_BACK_MAINNUI:
            {
                display.setCurrent(indexFunctionUI);
                break;
            }
            default:
                break;
        }
    }

    public void handleEvent(int eventID,  Object[] obj)
    {

    }这是个重载的方法,当有参数传递过来的时候我们调用后面的方法。

      接下来我们看界面类,它们通常包括控制器类、界面的Item还有一些Command。
public NewPhoneUI(UIController uicontroller)
    {
        super(Title.add_record);
        this.uicontroller = uicontroller;
        nameField = new TextField(Title.name, null, 25, TextField.ANY);
        mobileField = new TextField(Title.mobile, null, 25,
                TextField.PHONENUMBER);
        choice = new ChoiceGroup(Title.choice, ChoiceGroup.MULTIPLE);
        phoneField = new TextField(Title.phone, null, 25, TextField.PHONENUMBER);
        emailField = new TextField(Title.email, null, 25, TextField.EMAILADDR);
        choice.append(Title.detail, null);
        this.append(nameField);
        this.append(mobileField);
        this.append(choice);
        this.addCommand(saveCommand);
        this.addCommand(backCommand);
        this.setCommandListener(this);
        this.setItemStateListener(this);
    }通常他们把控制器类作为参数传递给构造器,并在构造器内部注册监听器,绘制界面等。它们通过commandAction()方法来传递事件编号给控制器类去处理,例如
    public void commandAction(Command arg0, Displayable arg1)
    {
        // TODO Auto-generated method stub
        if (arg0 == backCommand)
        {
            uicontroller
                    .handleEvent(UIController.EventID.EVENT_NEWPHONE_BACK_MAINUI);
        }

    }这样就基本上完成了导航问题,扩展起来非常容易,添加一个界面类,然后在控制器类中初始化并添加适当的事件编号就可以了。

      想起来,这种解决方法真是非常经典!!

应用MVC模式解决J2ME导航问题

作者:mingjava   文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=28开发MIDlet的程序员也许经常会被界面的导...
  • mobilechannel
  • mobilechannel
  • 2005年12月01日 12:59
  • 503

J2ME中文教程之J2ME技术概述

随着移动通信的突飞猛进,移动开发这个新鲜的字眼慢慢成为开发者关注的热点。在网上进行的最近一份调查显示,有24.34%的受访者涉足嵌入式/移动设备应用开发,这个数字可能略高于实际的比例,但也足可说明嵌入...
  • lpy123456
  • lpy123456
  • 2007年01月16日 12:37
  • 676

应用MVC模式解决J2ME导航问题[转自mingjava]

开发MIDlet的程序员也许经常会被界面的导航问题所困扰,尤其界面比较多的时候,通常有七、八个界面就会很让人头疼了。本文讲述如何应用MVC设计模式解决这类的问题。     MVC设计模式已经非常的成熟...
  • michaelchain
  • michaelchain
  • 2004年10月01日 03:39
  • 425

J2ME技术入门之一——J2ME程序的开发过程

       在进行J2ME开发以前,必须首先了解J2ME程序的开发过程,只有熟悉了开发过程以后才可以了解如何进行J2ME程序的开发。由于运行环境以及针对平台的不同,J2ME的开发过程和J2SE的开发...
  • Mailbomb
  • Mailbomb
  • 2005年06月23日 18:49
  • 2822

J2ME入门之HelloWorld

引言  前面几篇文章已经介绍了Eclipse及其工作环境的安装、配置过程,并完成各项相关准备工作。因此从本文开始将讲述如何使用前面配置好的Eclipse开发环境来创建J2ME项目,开始真正的J2ME开...
  • runner0592
  • runner0592
  • 2006年08月10日 23:35
  • 4109

J2ME中的MVC设计模式

(源自:http://www.j2medev.com/code/patterns/gof/200702/4162.html)一个好的用户界面(GUI)的设计通常可以在现实世界找到相应的表现。例如,如果...
  • njcit
  • njcit
  • 2010年09月15日 20:25
  • 318

eclipse中配置j2me,简单运行j2me程序

1.安装好jdk2.去官网上下载好eclipse,去eclipseme.org上下载eclipseme,http://www.oracle.com/technetwork/java/download-...
  • snrqtdhuqf
  • snrqtdhuqf
  • 2011年01月20日 10:09
  • 2389

“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”的解决办法

VC“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”的解决办法   该问题的原因之一:您的计算机的Windows Installer服务没有开启。 其解决方法...
  • zztfj
  • zztfj
  • 2012年11月10日 12:39
  • 2958

J2ME游戏按键处理方法简述

J2ME游戏按键处理方法简述 摘要:在游戏当中很多时候,要求按键有更多的响应方式,我们的问题就多起来了。  正文:1.ScanKey()方法这种方法使在keyPressed()、keyRelease(...
  • NetMicrobe
  • NetMicrobe
  • 2006年11月04日 15:37
  • 1944

用Eclipse做J2Me开发的前期配置

 我也是一个初学者,从一个初学者的角度上讲,就是要尽可能的详细,因为这个东西稍微配置不对,或者是那里没有注意到,就会走不少的弯路,所以我在这里把配置讲得非常的详细,以图文的形式展示,以免你看了不知道所...
  • fenglibing
  • fenglibing
  • 2007年09月05日 23:01
  • 10305
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:应用MVC设计模式解决J2ME应用程序导航问题
举报原因:
原因补充:

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