设计可组装的j2me UI(六) Dialog(对话框)
? ? ? 高级UI提供了一个Alert的控件可以有弹出对话框的效果。但是大家想不想自己实现一个呢。想不想知道sun是如何让Alert工作的呢?好请看下文
???? 设计思想是。建立一个 abstract?? class Dialog extends Canvas。下面的事情就让我们一步步花出来吧。
???? 实现理念是先绘制整个Canvas然后通过图形Graphics描绘成透明,接着在整个屏幕的中间去出一块区域来,至于上面你要做什么那就是你的事情了。哈。
??? 好看代码,
java 代码
?
- ?
- ?
- ?
- ?
- ??
- package?org.pook.ui.form;??
- ??
- import?java.util.TimerTask;??
- ??
- import?javax.microedition.lcdui.Canvas;??
- import?javax.microedition.lcdui.Display;??
- import?javax.microedition.lcdui.Font;??
- import?javax.microedition.lcdui.Graphics;??
- ??
- import?org.pook.log.Log;??
- import?org.pook.ui.Command;??
- import?org.pook.ui.SoftButton;??
- import?org.pook.ui.core.Platform;??
- import?org.pook.ui.event.CommandListener;??
- import?org.pook.ui.timer.TimerTaskManager;??
- ??
- ???
- ??
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ??
- public?abstract???class?Dialog?extends?Canvas?implements?Runnable?{??
- ????private?static?Log?log?=?Log.getLog("Dialog");??
- ??
- ????protected?final?int?X?=?0;??
- ??
- ????protected?final?int?Y?=?1;??
- ??
- ????protected???final?int?WIDTH?=?2;??
- ??
- ????protected?final?int?HEIGHT?=?3;??
- ??
- ??????
- ????protected?int[]?view?=?new?int[4];??
- ??
- ??????
- ????public?static?final?int?DIALOG_OK?=?0;??
- ??
- ??????
- ????public?static?final?int?DIALOG_CANCEL?=?2;??
- ??
- ??????
- ????public?static?final?int?DIALOG_YES_NO?=?3;??
- ??
- ??????
- ????public?static?final?int?DIALOG_OK_CANCEL?=?4;??
- ??
- ??????
- ????public?static?final?int?DIALOG_YES_NO_CANCEL?=?5;??
- ??
- ????public?static?final?int?DIALOG_TEXT?=?6;??
- ??
- ?????
- ?
- ??
- ????protected?Panel?parent;??
- ??
- ????protected?boolean?hasFocus;??
- ??
- ?????
- ?
- ??
- ????long?timeOut;??
- ??
- ?????
- ?
- ??
- ????int?type;??
- ??
- ??????
- ????protected?String?title;??
- ??
- ?????
- ?
- ??
- ????protected???String[]?rowTitle;??
- ??
- ????protected?int?bgColor;??
- ??
- ????protected?int?fontColor;??
- ??
- ????protected?Font?font?=?Font.getDefaultFont();??
- ??
- ??????
- ????protected?TimerTask?task;??
- ??
- ????protected?Display?display;??
- ??
- ????protected?SoftButton?softButton;??
- ??????
- ???
- ???
- ??????
- ??????
- ?????
- ?
- ?
- ?
- ?
- ??
- ????public?Dialog(String?title,?Panel?parent,?Display?display)?{??
- ????????this(title,?parent,?display,?3000);??
- ????}??
- ??
- ?????
- ?
- ?
- ?
- ?
- ?
- ??
- ????public?Dialog(String?title,?Panel?parent,?Display?display,?long?timeOut)?{??
- ????????this(title,?parent,?display,?Dialog.DIALOG_OK,?timeOut);??
- ????}??
- ??
- ?????
- ?
- ?
- ?
- ?
- ?
- ?
- ??
- ????public?Dialog(String?title,?Panel?parent,?Display?display,?int?type,??
- ????????????long?timeOut)?{??
- ????????setFullScreenMode(true);??
- ??????????
- ????????this.parent?=?parent;??
- ????????checkParent();??
- ??????????
- ????????this.timeOut?=?timeOut;??
- ????????this.type?=?type;??
- ????????this.title?=?title;??
- ????????this.display?=?display;??
- ??????????
- ????????softButton?=?new?SoftButton();??
- ??????????
- ???????
- ??????????
- ????????if?(timeOut?!=?0)??
- ????????????task?=?TimerTaskManager.getInstace().add(this,?timeOut);???
- ??????????
- ??????????
- ????????setStyle(0x0033FF,?0xFFFFFF);??
- ??????????
- ????}??
- ??
- ????public?void?setStyle(int?bgColor,?int?fontColor)?{??
- ????????this.bgColor?=?bgColor;??
- ????????this.fontColor?=?fontColor;??
- ????}??
- ??
- ????public?void?cancel()?{??
- ??????????
- ????????if?(parent?==?null)??
- ????????????throw?new?NullPointerException("Parent?is?not?Null.");??
- ??????????
- ????????task.cancel();??
- ????????if(parent?==?null)??
- ????????????return;??
- ??????????
- ????????display.setCurrent(parent);??
- ???????????
- ????}??
- ??
- ????public?void?addCommand(Command?cmd)?{??
- ????????this.softButton.addCommand(cmd);??
- ????}??
- ??
- ????public?void?setSoftButtonListener(CommandListener?cml)?{??
- ????????this.softButton.setCommandListener(cml);??
- ????}??
- ??????
- ????public?void?setSoftButtonStyle(int?bgColor,?int?fontColor){??
- ????????this.softButton.setStyle(bgColor,?fontColor);??
- ????}??
- ??
- ????public?void?run()?{??
- ????????cancel();??
- ??
- ????}??
- ??
- ??????
- ???public???void?drawRGB(Graphics?g)?{??
- ????????int?ai[]?=?new?int[Platform.WIDTH];??
- ????????for?(int?j1?=?0;?j1?<?ai.length;?j1++)??
- ????????????ai[j1]?=?0x90000000;??
- ????????g.drawRGB(ai,?0,?0,?0,?0,?Platform.WIDTH,?Platform.HEIGHT,?true);???
- ????}??
- ??
- ???????
- ???????
- ??
- ??
- ????private?void?checkParent()?{??
- ????????if?(parent?==?null){??
- ?????????????throw?new?NullPointerException("Parent?is?not?null");??
- ????????}??
- ??????????????
- ????}??
- ??
- ????protected?void?keyPressed(int?keyCode)?{??
- ????????softButton.onClick(keyCode);??
- ??????????
- ????}??
- ??
- ????public?void?setPanel(Panel?panel)?{??
- ????????this.parent?=?panel;??
- ??????????
- ????}??
- ??
- ????public?void?setTimeOut(long?timeOut)?{??
- ????????this.timeOut?=?timeOut;??
- ????}??
- ??
- ????public?int?getType()?{??
- ????????return?type;??
- ????}??
- ??
- ????public?void?setType(int?type)?{??
- ????????this.type?=?type;??
- ????}???
- }?
下面这段是弹出一个对话框实现
java 代码
?
- ?
- ?
- ?
- ?
- ??
- package?org.pook.ui.form;??
- ??
- import?java.util.Vector;??
- ??
- import?javax.microedition.lcdui.Font;??
- import?javax.microedition.lcdui.Graphics;??
- ??
- import?org.pook.Pook;??
- import?org.pook.log.Log;??
- import?org.pook.ui.Command;??
- import?org.pook.ui.SelectedPart;??
- import?org.pook.ui.core.Platform;??
- import?org.pook.ui.event.CommandListener;??
- import?org.pook.ui.util.FontUtil;??
- import?org.pook.ui.util.GraphicsUtil;??
- import?org.pook.util.StringUtil;??
- ???
- ???
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ??
- public?class?MessageDialog?extends?TextDialog?implements?CommandListener{??
- ????private?static?Log?log?=?Log.getLog("MessageDialog");??
- ??????
- ??????
- ????private?Command?ok;???
- ??????
- ????private??SelectedPart?plan;??
- ????private?int??planHeight;??
- ???
- ????private?int?contentHeight;??
- ???
- ????private?int?viewSize;??
- ????private?int?space;??
- ??????
- ???
- ????private?Vector?content;??
- ????private?int?selectIndex;??
- ????private?int?contentY;??
- ??????
- ????public?MessageDialog(String?_title,String?_message,?long?_timeOut)?{??
- ????????super(_title,??Pook.MAINMENU,?Pook.getDisplay(),?_timeOut);??
- ????????ok?=?new?Command("确定",Command.LEFT,?Command.FIRST_PRIORITY);??
- ????????this.addCommand(ok);??
- ????????this.setSoftButtonListener(this);??
- ????????this.setMessage(_message);??
- ????????initView();??
- ????????this.setStyle(0x001D68,?0xFFFFFF);??
- ????????this.setSoftButtonStyle(0x0071BD,0xFFFFFF);??
- ????????this.setType(Dialog.DIALOG_OK);??
- ????}??
- ??????
- ????public?void?setMessage(String?message){??
- ???
- ????????skipMessage(message);??
- ????}??
- ??????
- ??
- ????private?void?skipMessage(String?message)?{??
- ??????????
- ????????if(message?==?null)??
- ????????????return?;??
- ??????????
- ????????content?=?new?Vector();??
- ????????String[]?text?=?StringUtil.split(message,?"\n");??
- ??????????
- ????????for(int?j?=0;?j?<?text.length;?j++){??
- ???????????
- ????????????String[]?t?=?FontUtil.splitOnlyStringToRowString(font,text[j],view[WIDTH]-6);??
- ????????????for(int?i=0;?i
- ????????????????content.addElement(t[i]);??????
- ????????????}??
- ??????????????
- ????????}??
- ??????????
- ??????????
- ??????????
- ??????????
- ???????
- ??????????
- ???????????
- ??????????
- ??????????
- ????}??
- ??
- ????protected?void?keyPressed(int?keyCode)?{??
- ????????super.keyPressed(keyCode);??
- ????????this.thisUpAndDown(keyCode);??
- ????????this.repaint();??
- ????}??
- ??????
- ?????
- ?
- ?
- ?
- ??
- ????private?void?thisUpAndDown(int?keyCode)?{??
- ??????????
- ????????if?(this.content?==?null)??
- ????????????return;??
- ??????????
- ????????if(this.content.size()?<?this.viewSize)??
- ????????????return;??
- ??????????
- ????????switch?(keyCode)?{??
- ??
- ????????case?Platform.KEY_UP:?{??
- ??
- ?????????????selectIndex?=??selectIndex?<=?0???content.size()?-?viewSize?-?1??
- ????????????????????:?--selectIndex;??
- ??????????????
- ????????????break;??
- ??
- ????????}??
- ????????case?Platform.KEY_DOWN:?{??
- ?????????????selectIndex?=??selectIndex?>=content.size()?-?viewSize?-?1???0??
- ????????????????????:?++selectIndex;??
- ???????????????
- ??
- ????????????break;??
- ????????}??
- ????????}??
- ????}??
- ??
- ??
- ????public?void?commandAction(Command?cmd)?{??
- ????????if(cmd?==?ok)??
- ????????????this.cancel();??
- ??????????
- ????}??
- ????protected?void?paint(Graphics?g)?{??
- ????????parent.paint(g);??
- ????????drawRGB(g);??
- ????????this.softButton.paint(g);??
- ????????this.paintMessageDialog(g);??
- ??????????
- ????}??
- ??
- ??
- ??
- ????private?void?paintMessageDialog(Graphics?g)?{??
- ????????initView();??
- ????????g.setFont(font);??
- ????????GraphicsUtil.drawRectWithColor(g,0xFFD84F,?view[X]-1,view[Y]-1,view[WIDTH]+1,view[HEIGHT]+1);??
- ????????paintTitleImpl(g);??
- ????????paintContent(g);??
- ????????paintState(g);??
- ????}??
- ??????
- ????private?void?paintTitleImpl(Graphics?g)?{??
- ????????g.setColor(0x0071BC);??
- ????????g.fillRect(view[X],view[Y],view[WIDTH],font.getHeight()?+?2);??
- ????????g.setColor(0xFFFFFF);??
- ????????g.drawString(title,?view[X]?+?4,?view[Y]?+?1,Graphics.TOP|Graphics.LEFT);??
- ????}??
- ??????
- ????private?void?paintContent(Graphics?g)?{??
- ????????if(content.size()?>?viewSize?){??
- ????????????????this.plan?=?new?SelectedPart();??
- ????????????????plan.setStyle(0xFFFFFF,?0x000000);??
- ????????????????this.planHeight?=?contentHeight/(content.size()?-?viewSize);??
- ????????}??
- ????????contentY?=?view[Y]?+?font.getHeight()?+?4;??
- ???????????
- ????????g.setColor(0x001D68);??
- ????????g.fillRect(view[X],contentY,view[WIDTH],contentHeight);??
- ???
- ????????paintContentImpl(g);??
- ??????????
- ????}??
- ??????
- ????private?void?paintContentImpl(Graphics?g)?{??
- ????????if(content?==?null)??
- ????????????return?;??
- ??????
- ????????int?size?=?viewSize>content.size()?content.size():viewSize?+?selectIndex;??
- ??????????
- ????????g.setColor(0xFFFFFF);??
- ??????????
- ????????for(int?i?=?selectIndex;?i
- ????????????g.drawString((String)?content.elementAt(i),view[X]?+?2,?contentY?+?space?*?(i-selectIndex),?Graphics.TOP|Graphics.LEFT);??
- ????????}??
- ??????????
- ?????????
- ?
- ??
- ????????if(plan?!=?null){??
- ??????????????
- ????????????plan.changePosition(view[WIDTH]?+?4?,?contentY?+?this.planHeight?*selectIndex,?4,this.planHeight);??
- ????????????plan.paint(g);??
- ????????}??
- ????}??
- ??
- ????private?void?paintState(Graphics?g)?{??
- ????????int?height?=?Platform.HEIGHT?-?30?-?font.getHeight()?-?2;??
- ????????g.setColor(0x0071BC);??
- ????????g.fillRect(view[X],?height??,view[WIDTH],font.getHeight()?+?2);??
- ????????g.setColor(0xFFFFFF);??
- ????????g.drawLine(view[X],height,view[WIDTH]?+?10,?height);??
- ????????g.setColor(0xFFFFFF)