⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.java.svn-base

📁 开发框架。 一.说明: 此框架的意图是解决手机软件开发中常遇到
💻 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 + -