| 在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 = (amessage == 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里面就可以了! (52RD.com) |