在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());
}
}
考虑以下几个界面的程序:
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());
}
}

【责任编辑 孙杰】