使用J2ME的MVC2开源框架KBOX
文本Tag: J2ME
【IT168 技术】 kbox 是一个MVC2模型的J2ME开源框架,用于快速开发可扩展的J2ME MIDP应用程序。
其结构如图:
所有的可视组件都位于需要经由MIDlet来显示,而MIDlet上的所有事件,包括键盘事件,按钮事件提交到ActionController 上,ActionController跟据配置文件,将事件转发给相应的Action,Action将处理结果得到的可视组件(Displayable) 通过ActionForward返回MIDlet显示。
KBOX的使用非常简单, 以一个HELLO WORLD 为例:
创建一个MIDLET:
public class TestMIDlet extends MIDlet{
…
protected void startApp() throws MIDletStateChangeException {
ActionController controller = ActionController.getInstance( true );
controller.registerViewer(this); // Register the MIDlet
MyKGameCanvas mgc = new MyKGameCanvas( " MYGC " ); // Create a GameCanvas
KCommand kc = new KCommand( " TEST BUTTON " , Command.HELP, 1 , " MYCMD " , null );
mgc.addCommand(kc);
mgc.setCommandListener(controller);
Display.getDisplay(this).setCurrent(mgc);
}
…
}
创建一个Canvas:
public class MyKGameCanvas extends KGameCanvas{
public MyKGameCanvas( String uniqueID) {
super(uniqueID);
}
public void showString( String string ){
Graphics g = this.getGraphics();
g.setColor(0xFFFFFFFF);
g.fillRect( 0 , 0 , this.getWidth(), this.getHeight());
g.setColor(0xFF000000);
g.drawString( string , 0 , 0 , Graphics.TOP Graphics.LEFT);
this.flushGraphics();
}
}
创建相应的Action:
public class TestAction implements Action{
public void excute(KCommand cmd, Item item, Displayable dis, ActionForward forward,Hashtable parameters) {
MyKGameCanvas mkc = ((MyKGameCanvas)dis);
mkc.showString( " hello world! From " + mkc.getUniqueID() + " . " + cmd.getUniqueID());
}
}
将按钮事件注册给Action:
DEBUG = true // open the debug model of KBOX
CMD.MYCMD.ACTION = action.TestAction
注意这里的MyKGameCanvas 继承的KGameCanvas,而不是GameCanvas。KBOX的KGameCanvas类继承自GameCanvas,当并没有使用 GameCanvas那种使用线程监听状态的模型,而是重写了keypressed等方法来处理键盘事件。另外,KGameCanvas的重写的按钮事件 的处理已经实现了重复按键情况,而且可以指定重复按键的灵敏度,这点是非常好用的:)
KCommand是KBOX扩展的按钮组件。
KCommand kc = new KCommand( " TEST BUTTON " , Command.HELP, 1 , " MYCMD " , null );
第一个参数是按钮的名字,第二参数是按钮类型,第三个参数是优先级,第四个参数是ID名,用于配置文件的映射,对应“ CMD.MYCMD.ACTION=action.TestAction”中的MYCMD,第五个参数是可传递参数,是一个Hashtable类型,用于 向Action传递参数(当然你喜欢的话,也可以将参数提到配置文件里去……)。
KBOX的Action是一个只有execute方法的接口,任何类只要实现了该接口,都可以是一个Action。
注册一个键盘事件一样很简单:
public class TestKeyAction implements Action{
public void excute(KCommand cmd, Item item, Displayable dis, ActionForward forward,Hashtable parameters) {
MyKGameCanvas mkc = ((MyKGameCanvas)dis);
…
Do your business here.
..
}
}
指定键盘事件的处理Action
DEBUG = true // open the debug model of KBOX
CMD.MYCMD.ACTION = action.TestAction
KEY.MYGC.FIRE.ACTION = action.TestKeyAction…
KBOX的另外一个很实用的特性是DEBUG MODEL。
这个功能是用于在真机测试时,调试BUG用的。由于真机与模拟器不一定相同,当真机上抛出异常(真机上的异常无法察觉,没有控制台啊!),而模拟器又一 切正常的时候,这个功能就有用了:KBOX将捕获到的异常的用一个ERROR PAGE显示出来。不过注意在发布JAR包时,记得要去掉这个DEBUG模式,否则没事按到个没定义的键盘按键都会捕获到未定义按键处理的异常……
要打开DEBUG模式需要在配置文件上指定DEBUG=true。
源代码见附件