分享
 
 
 

基于MIDP实现Dialog组件

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

在MIDP中没有提供Dialog组件,但是提供了一个Alert。Alert的功能有限,因此写一个Dialog组件是非常有必要的。本文将提供一个基于MIDP的Dialog组件,你可以在应用程序中使用它,功能强大且非常方便。

当我们开发应用程序的时候,有的时候需要询问用户是不是要继续下面的操作,比如删除一个电话号码,然后根据用户的不同的动作进入不同的流程。这时候我们需要一个像样的Dialog组件,很遗憾MIDP中并没有提供,但是我们可以用Canvas自己写一个。下面将简单介绍这个组件的设计,然后给出测试的MIDlet的源代码。希望对读者有帮助!

首先我们写一个抽象类Dialog,内容如下

import javax.microedition.lcdui.*;

public abstract class Dialog

{

PRotected Display display;

protected DialogListener listener;

protected Displayable restore;

private int eventID;

protected Dialog(Display display)

{

this.display = display;

}

public int getEventID()

{

return eventID;

}

public void setEventID(int eventID)

{

this.eventID = eventID;

}

public void dismiss(int code)

{

Displayable curr = display.getCurrent();

if (curr != getDisplayable())

return;

if (restore != null)

{

display.setCurrent(restore);

} else

{

display.setCurrent(new Form(""));

}

if (listener != null)

{

listener.dialogDismissed(this, code);

}

}

public void display()

{

Displayable curr = display.getCurrent();

Displayable dialog = getDisplayable();

if (curr != dialog)

{

restore = curr;

display.setCurrent(dialog);

}

}

public void display(int event)

{

Displayable curr = display.getCurrent();

Displayable dialog = getDisplayable();

this.eventID = event;

if (curr != dialog)

{

restore = curr;

display.setCurrent(dialog);

}

}

public DialogListener getDialogListener()

{

return listener;

}

protected abstract Displayable getDisplayable();

public void setDialogListener(DialogListener l)

{

listener = l;

}

}

你需要覆盖getDisplayable()方法返回一个Displayable的对象,当你调用dialog的display()方法的时候,你的YourDialog将会显示在屏幕上,有的时候你可能要传递一个事件值给后面的对象,那么你应该调用方法display(int event)。Dialog可以注册DialogListener,这个接口定义了一个方法,内容如下:

public interface DialogListener

{

void dialogDismissed(Dialog dialog, int code);

}

当Dialog显示的时候,我们提供给用户的界面是用WaitCanvas实现的,下面是他的代码:

import java.util.*;

import javax.microedition.lcdui.*;

public class WaitCanvas extends Canvas

{

private int mCount, mMaximum;

private int mInterval;

private int mWidth, mHeight, mX, mY, mRadius;

private String mMessage;

private boolean run = false;

public WaitCanvas(String message, boolean run)

{

this.mMessage = message;

mCount = 0;

mMaximum = 36;

mInterval = 100;

mWidth = getWidth();

mHeight = getHeight();

// Calculate the radius.

int halfWidth = (mWidth - mRadius) / 2;

int halfHeight = (mHeight - mRadius) / 2;

mRadius = Math.min(halfWidth, halfHeight);

// Calculate the location.

mX = halfWidth - mRadius / 2;

mY = halfHeight - mRadius / 2;

// Create a Timer to update the display.

if (run)

{

TimerTask task = new TimerTask()

{

public void run()

{

mCount = (mCount + 1) % mMaximum;

repaint();

}

};

Timer timer = new Timer();

timer.schedule(task, 0, mInterval);

}

}

public void paint(Graphics g)

{

int theta = -(mCount * 360 / mMaximum);

// Clear the whole screen.

g.setColor(255, 255, 255);

g.fillRect(0, 0, mWidth, mHeight);

// Now draw the pinwheel.

g.setColor(128, 128, 255);

g.drawArc(mX, mY, mRadius, mRadius, 0, 360);

g.fillArc(mX, mY, mRadius, mRadius, theta + 90, 90);

g.fillArc(mX, mY, mRadius, mRadius, theta + 270, 90);

// Draw the message, if there is a message.

if (mMessage != null)

{

g.drawString(mMessage, mWidth / 2, mHeight, Graphics.BOTTOM

Graphics.HCENTER);

}

}

}

过控制boolean run的值可以决定是不是让这个画面动起来。下面两个例子是Dialog的子类,他们实现了它的抽象方法。我直接给出代码:

import javax.microedition.lcdui.*;

public class ConfirmationDialog extends Dialog implements CommandListener

{

public static final int YES = 0;

public static final int NO = 1;

protected Canvas canvas;

protected Command noCommand;

protected Command yesCommand;

private String message;

private String yesLabel;

private String noLabel;

public ConfirmationDialog(Display display, String message)

{

this(display, message, null, null);

}

public ConfirmationDialog(Display display, String amessage,

String ayesLabel, String anoLabel)

{

super(display);

this.message = (amessa

ge == null) ? "继续操作?" : amessage;

this.yesLabel = (yesLabel == null) ? "确定" : ayesLabel;

this.noLabel = (noLabel == null) ? "返回" : anoLabel;

yesCommand = new Command(yesLabel, Command.OK, 1);

noCommand = new Command(noLabel, Command.CANCEL, 1);

canvas = new WaitCanvas(message, true);

canvas.addCommand(yesCommand);

canvas.addCommand(noCommand);

canvas.setCommandListener(this);

}

public String getMessage()

{

return message;

}

public void setMessage(String message)

{

this.message = message;

}

public void commandAction(Command c, Displayable d)

{

if (c == yesCommand)

{

dismiss(YES);

} else if (c == noCommand)

{

dismiss(NO);

}

}

protected Displayable getDisplayable()

{

return canvas;

}

}

import javax.microedition.lcdui.*;

public class MessageDialog extends Dialog implements CommandListener

{

public static final int OK = 0;

protected Command command;

protected Canvas canvas;

private String message;

private String label;

public MessageDialog(Display display, String message)

{

this(display, message, null);

}

public MessageDialog(Display display, String amessage, String alabel)

{

super(display);

this.message = (amessage == null)?"完成":amessage;

this.label = (alabel == null)?"确定":alabel;

command = new Command(label, Command.OK, 1);

canvas = new WaitCanvas(message, true);

canvas.addCommand(command);

canvas.setCommandListener(this);

}

public void commandAction(Command c, Displayable d)

{

if (c == command)

{

dismiss(OK);

}

}

protected Displayable getDisplayable()

{

return canvas;

}

}

你可以方便的在自己的程序中使用这两个Dialog,你也可以扩展Dialog类实现自己的Dialog,下面是测试这两个Dialog的MIDlet。首先我们看一下它的截图然后给出源代码!

这里只给出用户选择确定的界面,如果你选择返回那么知识下面的文字改变。

import javax.microedition.lcdui.*;

import javax.microedition.midlet.*;

public class DialogTest extends MIDlet implements CommandListener,

DialogListener

{

private Display display;

private Form mainForm;

private ConfirmationDialog confirm;

private MessageDialog message;

public static final Command exitCommand = new Command("Exit", Command.EXIT,

1);

public DialogTest()

{

}

public void commandAction(Command c, Displayable d)

{

if (c == exitCommand)

{

exitMIDlet();

}

}

protected void destroyApp(boolean unconditional)

throws MIDletStateChangeException

{

exitMIDlet();

}

public void exitMIDlet()

{

notifyDestroyed();

}

public Display getDisplay()

{

return display;

}

protected void initMIDlet()

{

}

protected void pauseApp()

{

}

protected void startApp() throws MIDletStateChangeException

{

if (display == null)

{

display = Display.getDisplay(this);

initMIDlet();

}

confirm = new ConfirmationDialog(display, "继续操作嘛?");

confirm.setDialogListener(this);

confirm.display();

}

public void dialogDismissed(Dialog d, int code)

{

if (d == confirm)

{

if (code == ConfirmationDialog.YES)

{

message = new MessageDialog(display, "您选择了确定");

} else

{

message = new MessageDialog(display, "您选择了返回");

}

message.display();

message.setDialogListener(this);

} else if (d == message)

{

Form f = new Form(null);

f.append("退出程序");

f.addCommand(exitCommand);

f.setCommandListener(this);

display.setCurrent(f);

}

}

}

上面的整个代码是一个完整的Dialog组件(不包括DialogTest)如果需要使用直接放在你的project里面就可以了!

(出处:http://www.knowsky.com)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有