J2me程序设计之界面流程控制模式设计

来源:互联网 发布:大庄家软件 编辑:程序博客网 时间:2024/04/28 20:37
在LCDUI的架构中,画面上同一时间只能有一个Displayable对象,导致MIDP程序设计中,界面的流程跳转设计比较麻烦,本模式能解决此问题:

  考虑以下几个界面的程序:

  1. 帮助说明

  每个帮助说明的界面风格一致,只是说明文字不同,用Form实现。

  2. 版权声明

  给出系统的版权信息,用Alert实现,在一个游戏中最好只有一个,降低系统内存。

  3. 主界面

  用List的IMPLICIT实现,为了降低内存使用,在系统中也只存在一个。

  4. 设置界面

  用Form实现。

  5. 游戏界面

  用Canvas实现比较好。如果是其他应用也可以用Form来实现。

  6. 启动界面

  只是在系统开始时用到,用Alert实现。

  代码设计实现如下:

  package example.midletsuite;

  import javax.microedition.lcdui.*;

  import javax.microedition.midlet.*;

  import java.util.*;  

  public class FlowControl extends MIDlet{

  boolean init = true;

  public FlowControl(){

  Navigator.display = Display.getDisplay(this);

  Navigator.midlet = this;

  }

  protected void startApp(){

  Navigator.current = Navigator.MAIN_SCREEN;

  Navigator.show(null);

  if(init){

  Alert splash = new Alert("启动画面");

  splash.setType(AlertType.CONFIRMATION);

  splash.setTimeout(5000);

  Navigator.display.setCurrent(splash);

  init = false;

  }

  }

  protected void pauseApp(){}

  protected void destroyApp(boolean u){}

  }

  class Navigator{

  final public static int MAIN_SCREEN = 1;

  final public static int GAME_SCREEN = 2;

  final public static int SET_SCREEN = 3;

  final public static int SET_HELP_SCREEN = 4;

  final public static int GAME_HELP_SCREEN = 5;

  public static MIDlet midlet;

  public static Display display;

  public static int current = 1;

  

  public static void show(Object obj){

  switch(current){

  case MAIN_SCREEN:

  display.setCurrent(MainScreen.getInstance());

  break;

  case GAME_SCREEN:

  display.setCurrent(GameScreen.getInstance());

  break;

  case SET_SCREEN:

  display.setCurrent(SetScreen.getInstance());

  break;

  case SET_HELP_SCREEN:

  display.setCurrent(new HelpScreen((String)obj));

  break;

  case GAME_HELP_SCREEN:

  display.setCurrent(new HelpScreen((String)obj));

  break;

  }

  }

  public static void flow(String cmd){

  switch(current){

  case MAIN_SCREEN:

  if(cmd.equals("开始")){

  current = GAME_SCREEN;

  show(null);

  }else if(cmd.equals("设置")){

  current = SET_SCREEN;

  show(null);

  }else if(cmd.equals("版权声明")){

  display.setCurrent(CopyrightScreen.getInstance());

  show(null);

  }else if(cmd.equals("离开")){

  midlet.notifyDestroyed();

  }

  break;

  case GAME_SCREEN:

  if(cmd.equals("规则介绍")){

  current = GAME_HELP_SCREEN;

  show("游戏规则介绍");

  }else if(cmd.equals("返回")){

  current = MAIN_SCREEN;

  show(null);

  }

  break;

  case SET_SCREEN:

  if(cmd.equals("设置说明")){

  current = SET_HELP_SCREEN;

  show("设置方式");

  }else if(cmd.equals("返回")){

  current = MAIN_SCREEN;

  show(null);

  }

  break;

  case GAME_HELP_SCREEN:

  if(cmd.equals("返回")){

  current = GAME_SCREEN;

  show(null);

  }

  break;

  case SET_HELP_SCREEN:

  if(cmd.equals("返回")){

  current = SET_SCREEN;

  show(null);

  }

  break;

  }

  }

  }

  

  //帮助说明界面 Singleton模式

  class HelpScreen extends Form implements CommandListener{

  public HelpScreen(String c){

  super("帮助说明");

  append(c);

  addCommand(new Command("返回",Command.OK,1));

  setCommandListener(this);

  }

  public void commandAction(Command c,Displayable d){

  Navigator.flow(c.getLabel());

  }

  }

  

  //版权界面 Singleton模式

  class CopyrightScreen extends Alert{

  private static Displayable instance;

  synchronized public static Displayable getInstance(){

  if(instance == null){

  instance = new CopyrightScreen();

  }

  return instance;

  }

  private CopyrightScreen(){

  super("版权声明");

  setString("此应用程序之版权归NIIT教研室所有");

  setType(AlertType.INFO);

  setTimeout(Alert.FOREVER);

  }

  }

  

  //主界面 Singleton模式

  class MainScreen extends List implements CommandListener{

  private static Displayable instance;

  synchronized public static Displayable getInstance(){

  if(instance == null){

  instance = new MainScreen();

  }

  return instance;

  }

  private MainScreen(){

  super("主菜单",List.IMPLICIT);

  append("开始",null);

  append("设置",null);

  append("版权声明",null);

  append("离开",null);

  setCommandListener(this);

  }

  public void commandAction(Command c,Displayable d){

  String cmd = getString(getSelectedIndex());

  Navigator.flow(cmd);

  }

  }

  

  //设置主界面 Singleton模式

  class SetScreen extends Form implements CommandListener{

  private static Displayable instance;

  TextField url = null;

  Gauge volume = null;

  

  synchronized public static Displayable getInstance(){

  if(instance == null){

  instance = new SetScreen();

  }

  return instance;

  }

  private SetScreen(){

  super("设置");

  url = new TextField("请输入服务器的设置","socket://127.0.0.1:99",40,TextField.URL);

  append(url);

  volume = new Gauge("音量",true,10,3);

  append(volume);

  addCommand(new Command("设置说明",Command.HELP,1));

  addCommand(new Command("返回",Command.BACK,1));

  setCommandListener(this);

  }

  public void commandAction(Command c,Displayable d){

  Navigator.flow(c.getLabel());

  }

  }

  

  //游戏主界面 Singleton模式

  class GameScreen extends Form implements CommandListener{

  private static Displayable instance;

  TextField url = null;

  Gauge volume = null;

  

  synchronized public static Displayable getInstance(){

  if(instance == null){

  instance = new GameScreen();

  }

  return instance;

  }

  private GameScreen(){

  super("游戏");

  addCommand(new Command("规则介绍",Command.HELP,1));

  addCommand(new Command("返回",Command.BACK,1));

  setCommandListener(this);

  }

  public void commandAction(Command c,Displayable d){

  Navigator.flow(c.getLabel());

  }

  }

【责任编辑 孙杰】

 
原创粉丝点击