📄 menu.java.svn-base
字号:
package org.gggeye.easymf.ui;
import java.util.Vector;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
/**
* 菜单的设计方案 菜单的数据结构 首先菜单的数据结构是树形结构,数据结构的设计方式采用的是1-N的设计方式,并不是采用链表的方式进行设计。 功能有
* 1.支持3级菜单 2.支持菜单隐藏 3.支持
*/
public class Menu {
int left;
int top;
int right;
int buttom;
int width;
int height = 4;
Vector menuItems;
int backColor = 0xCC9966;
int fontColor = 0xFFFFFF;
Font font = Panel.defaultFont;
MenuItem leftMenu;
MenuItem rightMenu;
Panel panel;
EventListener eventListenter;
// MenuItem rightMenu;
boolean isOpen = false;
/**
* 处理菜单选中状态的情况
*/
int selectedId;
/**
* 处理选中情况下的选择条,用静态保存, 因为要渐变,怕影响性能。
*/
static Image selected = null;
public Menu(Panel _panel) {
this(3, _panel);
}
public Menu(int _menuSize, Panel _panel) {
this.panel = _panel;
menuItems = new Vector(_menuSize);
}
public final void addMenuItem(Image _icon, String _name, int _flag,
MenuItem _parent) {
if (_name == null)
throw new NullPointerException("Menu name is not Null");
MenuItem menuItem = new MenuItem(_icon, _name, _flag);
if (_parent != null) {
menuItem.parent = _parent;
_parent.children.addElement(menuItem);
}
menuItem.index = this.menuItems.size();
menuItems.addElement(menuItem);
int w = font.stringWidth(_name) + 40;
if (w > this.width)
width = w;
if (_parent == null) {
if (height < Panel.viewHeight) {
this.height += font.getHeight();
}
}
menuItem.left = 2;
menuItem.top = height - font.getHeight() - 2;
}
public final void doClick(int _keyCode) {
if (this.menuItems.size()> 0 && _keyCode == -6) {
isOpen = !isOpen;
panel.repaint();
return;
}else if(_keyCode == -7){
rightMenuAction(this.rightMenu);
}else if(_keyCode == -6){
rightMenuAction(this.leftMenu);
}
if (!isOpen) {
return;
}
switch (_keyCode) {
case 1:
move((byte) -1);
break;
case 6:
move((byte) 1);
break;
case 8:
menuAction();
break;
case -7:
break;
default:
break;
}
this.panel.repaint();
}
private void rightMenuAction(MenuItem _itemMenu) {
if (this.eventListenter != null) {
this.eventListenter.menuDoClick(_itemMenu, this.panel);
}
}
private void move(byte b) {
// 菜单向上移动
if (b == -1) {
selectedId = this.selectedId > 0 ? --this.selectedId
: this.menuItems.size() - 1;
} else {
selectedId = this.selectedId < this.menuItems.size() - 1 ? ++this.selectedId
: 0;
}
}
private void menuAction() {
// isOpen = !isOpen;
MenuItem menuItem = (MenuItem) this.menuItems
.elementAt(this.selectedId);
if (this.eventListenter != null) {
this.eventListenter.menuDoClick(menuItem, this.panel);
}
}
final void doPaint(Graphics _g) {
Pen tPen = new Pen(_g);
tPen.setOffset(0, Panel.viewHeight
+ Panel.labelHeight - this.height);
// _point.setColor(this.fontColor);
doPaintMenuImpl(tPen);
tPen.save();
tPen.setColor(0xFFFFFF);
if (rightMenu != null) {
tPen.graphics.drawString(rightMenu.name, rightMenu.left ,
rightMenu.top, 20);
}
if (this.leftMenu != null && this.menuItems != null
&& this.menuItems.size() == 0) {
tPen.graphics.drawString(leftMenu.name, leftMenu.left ,
leftMenu.top, 20);
}
tPen.reset();
}
/**
* 绘制菜单
*
* @param player
*/
void doDrawMenu(Pen p) {
p.save();
p.setColor(0xCEF);
int y = Panel.height - Panel.labelHeight;
p.graphics.fillRect(0, y, Panel.width,
Panel.labelHeight);
y += (Panel.labelHeight - Panel.defaultFont.getHeight()) >> 1;
String title = "菜单";
// if(this.htmlDocument != null && htmlDocument.title == null){
// title = htmlDocument.title;
// }
p.setColor(0xFFFFFF);
p.graphics.drawString(Runtime.getRuntime().freeMemory() / 1024 + "",
50, y, 20);
//if(this.panel.menu != null && this.panel.menu.menuItems.size() >1){
p.graphics.drawString(title, 0, y, 20);
//}
p.reset();
}
private void createSelected() {
selected = Image.createImage(width - 4, this.font.getHeight());
Graphics g = selected.getGraphics();
Pen point = new Pen(g);
point.drawShadeRect(0xCCD, 0, 0, width - 4, height);
}
/**
* 本来想静态计算菜单的高宽。还是算了吧。动态的吧。
*
* @param _point
*/
private void doPaintMenuImpl(Pen _point) {
if (this.menuItems.size() == 0 || !this.isOpen) {
return;
}
if (selected == null || selected.getWidth()!=this.width) {
this.createSelected();
}
_point.save();
_point.setFont(font);
// point.dr
_point.setColor(0x0);
_point.drawRect(left, top, width, height);
_point.setColor(this.backColor);
_point.fillRect(left + 1, top + 1, width - 2, height - 2);
_point.setColor(0xFFFFFF);
// 画条白线
_point.drawRect(left + 1, top + 1, width - 2, height - 2);
_point.reset();
_point.save();
_point.setColor(this.fontColor);
for (int j = 0; j < this.menuItems.size(); j++) {
MenuItem menuItem = (MenuItem) this.menuItems.elementAt(j);
if (this.selectedId == menuItem.index) {
_point
.drawImage(selected, menuItem.left, menuItem.top,
20);
}
_point.drawString(menuItem.name, menuItem.left + 2, menuItem.top,
20);
}
_point.reset();
}
public final void setRightMenu(String _name, int _flag) {
rightMenu = new MenuItem(null, _name, _flag);
rightMenu.left = Panel.width - font.stringWidth(_name);
rightMenu.top = Panel.height - Panel.labelHeight;
}
public final void setLeftMenu(String _name, int _flag) {
leftMenu = new MenuItem(null, _name, _flag);
leftMenu.left = 2;
leftMenu.top = Panel.height - Panel.labelHeight;
}
public final void setEventListener(EventListener _eventListener){
this.eventListenter = _eventListener;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -