自己画J2ME的菜单

前两个月差不多一直在学习EVC编程,学的挺枯燥的。

上周一(8月26号)左右吧。突然想搞一下J2ME.

在网上看了一下j2me的文章,学了一下怎么在Eclipse下搭建环境(菜乌级水平),看看sun自己提供的例子。

发现 j2me 提供的command在不同的终端上显示的风格完全不一样了。而且不支持2级或者以上的菜单(至少我没有发现~)。

突发奇想,为什么不自己做个框架呢,像EVC那样,Windows就是好啊,开发啥都方便,那菜单真好。~

Windows的菜单那个“影子效果“不错,其实就是先画一个带边界线的矩形,然后在右边画一个竖线,下边画一个横线,颜色调好,坐标调好。看起来就像立体感觉了。~~

然后就学着windows的效果来画吧。反正J2ME提供了一个比较低级的UI类Canvas(对于我这样的莱乌这能用低级类库啦),多亏刚入门java的时候学习了半年多的swing啊,也做过几个关于swing的项目,对于java 画图还是比较熟悉的哈。

说正题吧,想法呢,就是把屏幕分成三个部门。顶端标题栏(Header),低端菜单部分(MenuBar),中间工作区是留给子类去画的。菜单的使用呢,只要你继承这个类就可以了。然后像使用Swing那样,一个对象一个对象的往里面扔吧。你写你的程序,让他自己去画吧。

抽象类要完成对菜单的控制,以及工作区的重画和保存。

经过3天的业余时间终于搞定了。

我认为手机的菜单最多分两级就足够了,而且菜单项不会超过8个。这个是我的假设哈,理论上可以无线分级的啊。

有了这个菜单框架,如果需要自己绘图,那就专心绘图吧,不用关系菜单啥的处理了。。。

目前是预览版本,在我的手机上和模拟器上都测试通过,但是没有对手写机器的支持,下一步找一个手写机器来测试。

还有打算在工作区加上一个滚动条。实现滚动效果。。。目前只支持全屏下的显示。

将来在这个基础上开发一个Table,List,,Calendar….等等。。嘿嘿,等待你一起来开发啊。。。

说了半天了,都是文字累了吧。看看截图吧。。。

(图一):启动界面,我特意加上了icon,按照Windows CE的习惯 菜单在右侧,当然,也可以通过设置布局来调整哦。

(图二点一下右键,菜单就展开了,这个菜单眼悉吧~)

(图三:点ok键或者右键,就展开了2级菜单)

(图四:选择2级菜单的某项后点了确认键,触发了我注册的事件)

(图五:来玩玩用这个工具开发的拼图游戏吧,去掉了那些ICON)

(图六:查看排行榜)

看看是如何使用这个工具的呢~

看看拼图的程序的核心代码~~

private Header header = null;
 
private MenuBar menuBar = null;
 
private Menu mainMenu = null;
 
private MenuItem startItem = null;
 
private MenuItem saveItem = null;
 
private MenuItem topItem = null;
 
private Component label = null;
 
//构造函数中初始化:
 
header = new Header("拼图游戏");
header.setBackground(0xEFEFEF);
header.setHeight(30);
menuBar = new MenuBar();
mainMenu = new Menu("菜单");
startItem = new MenuItem("开始游戏");
saveItem = new MenuItem("存盘");
topItem = new MenuItem("排行榜");
mainMenu.addItem(startItem);
mainMenu.addItem(topItem);
mainMenu.addSeparator();
mainMenu.addItem(saveItem);
mainMenu.setItemListener(new MainMenuListener());//菜单事件
label = new Component("后退");
label.setKeyListener(new ExitKeyListener());
menuBar.setMenu(mainMenu);
menuBar.setLabel(label);
menuBar.setLayout(MenuBar.MENU_LAYOUT_R);//也可以左侧显示菜单
setFullScreenMode(true);
setHeader(header);
setKeyPressedListener(new PicKeyListener());//注册任何键事件,
setMenuBar(menuBar);

看看事件的实现。。。

class MainMenuListener implements IMenuItemListener {
public void actionPerformed(IMenuItemEvent e) {
if (e.getItem() == startItem) {
init();
repaint();
}else if(e.getItem()==topItem){
alert.setString("哈哈,暂时没有排行啊");
parent.display.setCurrent(alert);
}else if(e.getItem()==saveItem)
{
alert.setString("这样也能保存啊");
parent.display.setCurrent(alert);
}
}
};
 
class ExitKeyListener implements IKeyListener{
 
public void actionPerformed(Object obj, IEvent e) {
// TODO Auto-generated method stub
parent.display.setCurrent(parent.mainForm);
}
 
 
}
分享到: 更多