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

📄 softbutton.java

📁 j2me开发的1个简单的wap浏览器.程序框架还是不错的.包括对低级事件的处理.通信框架,标签的解析
💻 JAVA
字号:
/********************************************************************
 * 项目名称				:<b>足球项目j2me客户端</b>			<br/>
 * 
 * Copyright 2005-2006 Teesoo. All rights reserved
 ********************************************************************/
package org.wuhua.wap.ui;

import java.util.Vector;

import javax.microedition.lcdui.Graphics;

import org.wuhua.wap.Resources;
import org.wuhua.wap.log.Logger;
import org.wuhua.wap.ui.core.Platform;
import org.wuhua.wap.ui.event.CommandListener;
import org.wuhua.wap.util.GraphicsUtil;

/**
 * <b>类名:SoftButton.java</b> </br> 编写日期: 2006-9-14 <br/> 
 * 程序功能描述: 个人认为这里的代码设计的不好,重复代码过多,应该重构,应该把那些命令的绘制当做一个容器来管理<br/> Demo:
 * <br/> Bug: <br/>
 * 
 * 程序变更日期 :<br/> 变更作者 :<br/> 变更说明 :<br/>
 * 
 * @author wuhua </br> <a href="mailto:rrq12345@163.com">rrq12345@163.com</a>
 */
public class SoftButton extends Part {
	Logger logger = Logger.getLogger("SoftButton");

	/** 软键 * */

	private CommandListener commandListener;

	private Vector left;

	private Command right;

	private Command middle;

	private boolean isSelectLeftCmd;
	private boolean isSelectLeftCmdItem;
	
	private int leftCmdItemIndex;
	private int leftItemIndexStart;

	private int leftCmdIndex;

	private int numOfEls;
	private int itemNumOfEls;

	private int startIndex;

	private int paintSize = 5;
	private int itemPaintSize = 5;
	private Command currentCmd;
	
	private SelectedPart selected;
	
    private String menu = "菜单";
    private String select = "选择";
    private String cancel = "取消";
	/**
	 * 构造固定位置的软键条
	 * 
	 */
	public SoftButton() {
		super(0, Platform.HEIGHT - 20, Platform.WIDTH, Platform.HEIGHT);
		selected = new SelectedPart();
	}

	/**
	 * 添加一列,我的想法是让左列软件可以多个
	 * 
	 * @param item
	 */
	public void addCommand(Command cmd) {
		if (cmd.type == Command.LEFT)
			addCommandLeftImpl(cmd);
		else if (cmd.type == Command.RIGHT) {
			this.right = cmd;
		} else if (cmd.type == Command.MIDDLE) {

			this.middle = cmd;
		}

	}

	/**
	 * 推进去
	 * 
	 * @param cmd
	 */
	private void addCommandLeftImpl(Command cmd) {
		if (left == null)
			left = new Vector();
		left.addElement(cmd);
		numOfEls = left.size();

	}

	/**
	 * 判断当前选择条是否到了底部,经过用户的选择,这些选择条会不断的变化</br> 变化的依据是当selectPosition >=
	 * viewPart[HEIGHT]*/
	private void changeSelectIndex(){
		int num = (this.paintSize < numOfEls)?paintSize:numOfEls;//取可显示的菜单项数目
		if (leftCmdIndex>num-1)
		{
			startIndex++;
			leftCmdIndex=(byte)(num-1);
		}

		if (leftCmdIndex < 0)
		{
			if (startIndex>0)
			{
				leftCmdIndex =0;
				startIndex--;
			}
			else
			{
				startIndex = numOfEls-num;
				leftCmdIndex=num-1;
			}

		}
		if (startIndex+ leftCmdIndex > numOfEls -1)
		{
			startIndex= 0;
			leftCmdIndex = 0;
		}
	}

	// 判断是否存在这个命令,如果为空,或者标题为""则表示不存在
	private boolean cmdIsExist(Command cmd) {
		if (cmd == null || cmd.equals(""))
			return false;
		else
			return true;

	}

	private void enterAction() {
		if(this.isSelectLeftCmd){
			leftAction();
		}
		
	}

	// 填充cmds区域
	private void fillCmdsClip(Graphics g) {

		if (Platform.HEIGHT - 20 > this.view[HEIGHT]) {
			view[Y] = Platform.HEIGHT - 20;
			view[HEIGHT] = Platform.HEIGHT;
		}
		g.setColor(bgColor);
		g.fillRect(view[X], view[Y], view[WIDTH], view[HEIGHT]);

		g.setColor(0xFFFFFF);
		// 画条白线
		g.drawLine(view[X], view[Y] - 1, view[WIDTH], view[Y] - 1);

	}

	/**
	 * 填充颜色并且绘制左列菜单出来
	 * 
	 */
	private void fillLeftBackground(Graphics g) {
		int size =  paintSize >  numOfEls?  numOfEls:this.paintSize + startIndex;
		 
		int height = (paintSize>numOfEls?numOfEls:paintSize) * font.getHeight() + 2;
		int width = 60;

		int startY = Platform.HEIGHT - 23 - height;
		
		
		paintCmdNameImpl(g,size,this.startIndex,this.leftCmdIndex,0, startY,width, height,left);
		
		paintLeftCmdItem(g);
	}

	/**
	 * 把那些cmd绘制出来
	 * @param g
	 * @param startX
	 * @param startY
	 * @param items
	 */
	private void paintCmdNameImpl(Graphics g,int size, int startIndex, int selectIndex, int startX, int startY,int width, int height,Vector items) {
		
		GraphicsUtil.drawSreenBorder(g, 0x000000, startX, startY-2, width+3, height+3);
		GraphicsUtil.drawSreenBorder(g, 0xFFFFFF, startX + 1, startY-1 , width+1, height+1);
		GraphicsUtil.fillSreen(g, this.bgColor, startX + 2, startY, width, height);

		// 绘制选择条
		//GraphicsUtil.fillSreen(g,  0xFFFFF, startX + 2, startY + font.getHeight()*selectedIndex  , 
			//	width, font.getHeight()+2 );
		selected.changePosition(startX + 2, startY + font.getHeight()*selectIndex, width, font.getHeight()+2);
		selected.paint(g);

		g.setColor(fontColor);
		
		

		for(int i =startIndex,j=0; i< size; i++, j++){
			Command cmd;
			if( selectIndex == j){
				cmd = (Command) items.elementAt(selectIndex+startIndex);
			}else{
				cmd = (Command) items.elementAt(i);
			}
			g.drawString(cmd.getName(), startX + 10, startY + 2 + font.getHeight() * j,
					Graphics.TOP | Graphics.LEFT);
			cmd.setHeight(startY + 2 + font.getHeight() * j);
			//绘制箭头
			if(cmd.hasItem()){
				g.drawImage(Resources.ARROW, font.stringWidth(cmd.getName()) + startX + 20, startY + 2 + font.getHeight() * j + 4,
						Graphics.TOP | Graphics.LEFT);
			}
		}
	}
	

	/**
	 * 绘制CmdItem。
	 * @param g
	 */
	private void paintLeftCmdItem(Graphics g) {
		 
		 if(this.isSelectLeftCmdItem){
			 currentCmd =   (Command)left.elementAt(this.leftCmdIndex + this.startIndex);
			 if(currentCmd.hasItem()){	
				 Vector items = currentCmd.getItems();
				 itemNumOfEls = items.size();
				 int size =  itemPaintSize > itemNumOfEls ? itemNumOfEls:this.itemPaintSize + this.leftItemIndexStart;
				 int height = (itemPaintSize>itemNumOfEls?itemNumOfEls:itemPaintSize) * font.getHeight() + 2;
				 int width = 60;
				 
				
				 paintCmdNameImpl(g,size,this.leftItemIndexStart,this.leftCmdItemIndex,50, currentCmd.getHeight() - 30,width, height,items);
			 }
		 }
		
	}

	/**
	 * 友键动作
	 * 
	 */
	private void leftAction() {

		if(left.size() == 1){
			commandListener.commandAction((Command) left.elementAt(0));
			return;
		}
		
		if (isSelectLeftCmd) {
			Command cmd = (Command) left.elementAt(leftCmdIndex  + startIndex);
			if(cmd.hasItem()){
				if(isSelectLeftCmdItem){
					Vector items = cmd.getItems();
					cmd = (Command)items.elementAt(this.leftCmdItemIndex + this.leftItemIndexStart);
					 
					commandListener.commandAction(cmd);
					isSelectLeftCmdItem = false;
				}else{
					isSelectLeftCmdItem = true;
				}
				
			}else{
				commandListener.commandAction(cmd);
			}
			
			logger.debug(cmd.getName());
			
			if(!isSelectLeftCmdItem){
				isSelectLeftCmd = false;
				return;
			} 
		}
		this.isSelectLeftCmd = true;
		 

	}

	/**
	 * 左列上下动作
	 * @param keyCode
	 */
	private void leftUpAndDown(int keyCode) {
		if(!isSelectLeftCmd)
			return;
		if(!isSelectLeftCmdItem)
			leftCmdAction(keyCode); 
		else
			leftCmdItemUpAndDown(keyCode);

	}

	private void leftCmdAction(int keyCode) {
		if(this.numOfEls == 0)
			return;
		switch (keyCode) {

		case Platform.KEY_UP: {
			leftCmdIndex--;
			break;
		}
		case Platform.KEY_DOWN: {
			leftCmdIndex++;

			break;
		}
		}

		changeSelectIndex();
	}
	
	/**
	 * 左列上下动作
	 * @param keyCode
	 */
	private void leftCmdItemUpAndDown(int keyCode) {
		if(this.itemNumOfEls == 0)
			return;
		switch (keyCode) {

		case Platform.KEY_UP: {
			leftCmdItemIndex--;
			break;
		}
		case Platform.KEY_DOWN: {
			leftCmdItemIndex++;
			break;
		}
		}

		changeSelectLeftItmeIndex(); 

	}
	
	

	private void changeSelectLeftItmeIndex() {
		int num = (this.itemPaintSize < itemNumOfEls)?itemPaintSize:itemNumOfEls;//取可显示的菜单项数目
		if (leftCmdItemIndex>num-1)
		{
			leftItemIndexStart++;
			leftCmdItemIndex=(byte)(num-1);
		}

		if (leftCmdItemIndex < 0)
		{
			if (leftItemIndexStart>0)
			{
				leftCmdItemIndex =0;
				leftItemIndexStart--;
			}
			else
			{
				leftItemIndexStart = itemNumOfEls-num;
				leftCmdItemIndex=num-1;
			}

		}
		if (leftItemIndexStart+ leftCmdItemIndex > itemNumOfEls -1)
		{
			leftItemIndexStart= 0;
			leftCmdItemIndex = 0;
		}
		
	}

	/**
	 * 按钮的动作
	 */
	public void onClick(int keyCode) {

		if (this.commandListener == null)
			return;

		if (keyCode == Platform.KEY_SOFT_LEFT) {
			leftAction();
		} else if (keyCode == Platform.KEY_SOFT_RIGHT && cmdIsExist(right)) {
			rightAction();
		} else if (keyCode == Platform.KEY_ENTER) {
			enterAction();

		}else if(keyCode == Platform.KEY_UP || keyCode == Platform.KEY_DOWN){
			leftUpAndDown(keyCode);
		}else if(keyCode == Platform.KEY_RIGHT || keyCode == Platform.KEY_LEFT){
		 
			leftItemLeftAndRight(keyCode);
			 
		}

	}

	/**
	 * 左列菜单左右事件
	 * @param keyCode
	 */
	private void leftItemLeftAndRight(int keyCode) {	 
		 currentCmd = (Command) left.elementAt(leftCmdIndex  + startIndex);
		if(!currentCmd.hasItem()
				|| this.numOfEls <=0)
			return;
		switch (keyCode) {

		case Platform.KEY_RIGHT: {
			isSelectLeftCmdItem = true;
			break;
		}
		case Platform.KEY_LEFT: {
			isSelectLeftCmdItem = false;
			this.itemNumOfEls = 0;
			this.leftCmdItemIndex = 0;
			this.leftItemIndexStart = 0;
			break;
		}
		}
	}

	public void paint(Graphics g) {
		//获取Form的字体,保存到下面
		this.font = g.getFont();
		paintCmdsImpl(g);

	}
	/**
	 * 绘制cmds
	 */
	private void paintCmdsImpl(Graphics g) {
		fillCmdsClip(g);
		paintCmdNames(g);
	}
	
	private void paintCmdNames(Graphics g) {
		g.setFont(this.font);

		g.setColor(fontColor);

		if (left != null) {
			// 如果选择列表的时候,要绘制取消跟选择所以就只好return
			if (isSelectLeftCmd) {
				paintLeftImpl(g);
				paintSelectAndCancel(g);
				return;
			} else {
				if(left.size()== 1){
					g.drawString(((Command)left.elementAt(0)).getName(), view[X], view[Y] + (20-font.getHeight())/2, Graphics.LEFT
							| Graphics.TOP);
				}else{
					g.drawString(menu, view[X], view[Y] + (20-font.getHeight())/2, Graphics.LEFT
							| Graphics.TOP);
				}
				
			}
		}

		if (middle != null) {
			g.drawString(middle.name, view[WIDTH] / 2, view[Y] + (20-font.getHeight())/2,
					Graphics.HCENTER | Graphics.TOP);
		}
		if (right != null) {
			g.drawString(right.name, view[WIDTH] - 2, view[Y] + (20-font.getHeight())/2, Graphics.TOP
					| Graphics.RIGHT);
		}
	}



	/**
	 * 绘制菜单的实现
	 * 
	 * @param g
	 */
	private void paintLeftImpl(Graphics g) {
		if (left == null)
			return;
		fillLeftBackground(g);

	}

	/*
	 * 绘制选择跟取消
	 */
	private void paintSelectAndCancel(Graphics g) {
		g.drawString(select, view[X], view[Y] + (20-font.getHeight())/2, Graphics.LEFT | Graphics.TOP);
		g.drawString(cancel, view[WIDTH] - 2, view[Y] + (20-font.getHeight())/2, Graphics.TOP
				| Graphics.RIGHT);
	}

	/** 删除相应的Command */
	public void removeCommand(Command cmd) {
		if (cmd.type == Command.LEFT)
			removeCommandLeftImpl(cmd);
		else if (cmd.type == Command.MIDDLE)
			middle = null;
		else if (cmd.type == Command.RIGHT)
			right = null;
	}

	/**
	 * 删除左列表的cmd,通过查找方式删除
	 * @param cmd
	 */
	private void removeCommandLeftImpl(Command cmd) {
		boolean ok = false;
		if (left != null)
			ok = left.removeElement(cmd);
		if(ok)
			return;
		else{
			for(int i =0; i < left.size(); i++){
				Command c = (Command) left.elementAt(i);
				if(c.hasItem())
					c.removeCommandItem(cmd);
			}
		}

	}

	private void rightAction() {
		if (isSelectLeftCmd) {
			isSelectLeftCmd = false;
			return;
		}
		commandListener.commandAction(right);
	}

	/**
	 * 注册监视器
	 */
	public void setCommandListener(CommandListener commandListener) {
		this.commandListener = commandListener;
	}
	
	public void setSelectedStyle(int selectColor){
		this.selected.setStyle(selectColor, fontColor);
	}

	public final void setCancel(String cancel) {
		this.cancel = cancel;
	}

	public final void setMenu(String menu) {
		this.menu = menu;
	}

	public final void setSelect(String select) {
		this.select = select;
	}
	
	public int getHeight() {
		// TODO 自动生成方法存根
		return 0;
	}

	public final boolean isSelectLeftCmd() {
		return isSelectLeftCmd;
	}
	
	public int getWidth() {
		return font.stringWidth(text);
	}
	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -