j2me的两种菜单使用总结

 

昨天主管叫我做个菜单,我把题意理解错了,也可以说是没问清楚吧

开始做了个command的菜单,后来他说要用canvas画,又做了一个非常难看的,被打了回来,看了别的软件的菜单样式,重新写了一个

 

1.command菜单

菜单代码如下:

package karant.zhan;

import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class MenuDemo extends MIDlet implements CommandListener{

	Display display; 
	Form form;
	Alert alert;
    private Command backCommand = new Command("Back", Command.BACK, 1);
    private Command exitCommand = new Command("Exit", Command.EXIT, 60);
    private Command ebestCommand = new Command("Ebest", Command.SCREEN, 22);
    private Command jordanCommand = new Command("Jordan", Command.OK, 23);
    private Command whutCommand = new Command("Whut", Command.SCREEN, 24);
    private Command y33Command = new Command("ye33", Command.SCREEN, 25);
   
	public MenuDemo() {
		display = Display.getDisplay(this);
		Form form = new Form("Menu Test");
		form.addCommand(exitCommand);
		form.addCommand(ebestCommand);
		form.addCommand(backCommand);
		form.addCommand(jordanCommand);
		form.addCommand(whutCommand);
		form.addCommand(y33Command);
		form.setCommandListener(this);
		alert = new Alert("");
		display.setCurrent(form);
	}

	protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
		

	}

	protected void pauseApp() {
		// TODO Auto-generated method stub

	}

	protected void startApp() throws MIDletStateChangeException {
	
		
	}

	public void commandAction(Command c, Displayable d) {
		
	if(c == ebestCommand)
	{
		alert.setString("     Hello Ebest");
		display.setCurrent(alert);
		
	}
	else if(c == whutCommand)
	{
		alert.setString("     Hello Whut");
		display.setCurrent(alert);
	}
	else if(c == y33Command)
	{
		alert.setString("     Love y33");
		display.setCurrent(alert);
	}
	else if(c == jordanCommand)
	{
		alert.setString("     My Ido Jordan");
		display.setCurrent(alert);
	}
	else if(c == exitCommand)
	{
		try {
			destroyApp(false);
		} catch (MIDletStateChangeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		notifyDestroyed();
	}
		
	}

}


上传图片不能用

 

2.下面是用canvas画的,焦点效果要好点

 

MIDlet类代码如下:

package karant.zhan;

import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class DrawMenuMIDlet extends MIDlet {

	MenuAction menuAction;
	Display display;
	
	public DrawMenuMIDlet() {
		display = Display.getDisplay(this);
		menuAction = new MenuAction(this);
	}

	protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
		// TODO Auto-generated method stub

	}

	protected void pauseApp() {
		// TODO Auto-generated method stub

	}

	protected void startApp() throws MIDletStateChangeException {
		// TODO Auto-generated method stub

	}

}

 

 

下面是绘制菜单的类MenuCanvas

package karant.zhan;

import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;

public class MenuCanvas {

   private String leftOption; 
   private String rightOption;
   private String backOption = "返回";
   private String[] menuOptions;
   private int padding = 5; //边框与屏幕距离
   
   //颜色设置
   private static final int defaulFontColor = 0x000000;  //默认字体颜色
   private static final int selectedFontColor = 0XB0171F;  //选中后字体颜色
   private static final int bgColor = 0xfec6e9;  // 菜单背景颜色
   private static final int heighLight = 0xDA70D6; //选中的菜单高亮显示颜色

	//构造函数 初始化
	public MenuCanvas(String leftOption, String rightOption,
			String[] menuOptions) {
		this.leftOption = leftOption;
		this.rightOption = rightOption;
		this.menuOptions = menuOptions;
	}
	
	
	//绘制默认显示的状态
	public void drawInactiveMenu(GameCanvas canvas, Graphics g){
		Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM);  //获得字体
		int fontHeignt = font.getHeight();  
		int width = canvas.getWidth();
		int height = canvas.getHeight();
		g.setColor(bgColor);    //设置背景
		g.fillRoundRect(0, height - fontHeignt - 2*padding, width, height, 10, 10);  //绘制初始左右菜单位置矩形框
		g.setFont(font);   //设置字体
		g.setColor(defaulFontColor);   //设置为默认字体颜色
		g.drawString(leftOption , padding, height - padding, g.LEFT|g.BOTTOM);    //绘制左按钮
		g.drawString(rightOption, width-padding, height - padding, g.RIGHT|g.BOTTOM);  //绘制右按钮
		canvas.flushGraphics();  //将设置好的东西重新刷屏显示
		
		
		
	}

	//绘制选择菜单时的状态
	public void drawActiveMenu(GameCanvas canvas, Graphics g, int select){
		Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM);  //设置字体
		int fontHeight = font.getHeight();  //字体高度
		int width = canvas.getWidth();  //屏幕宽
		int height = canvas.getHeight(); //屏幕高
		g.setColor(bgColor);    //设置菜单背景颜色
		g.fillRoundRect(0, height - fontHeight - 2*padding, width, height, 10, 10);  //画菜单选项的圆角矩形
		
		//绘制默认的左右选项
		g.setFont(font);
		g.setColor(defaulFontColor);
		  g.drawString(leftOption, padding, height - padding, g.LEFT | g.BOTTOM);
		  // draw "Cancel" option
		  g.drawString(backOption, width - padding, height - padding, g.RIGHT
		    | g.BOTTOM);
		  canvas.flushGraphics();  //设置好后刷屏绘制出来
		  
		if(menuOptions != null){ //存储菜单选项的数组不为空时
			int menuMaxWidth = 0; //最大菜单宽度
			int menuMaxHeight = 0; //最大菜单高度
			int currentWidth = 0; //目前宽度
			
			//用来选出菜单选项最大子菜单的宽度
			for(int i = 0 ; i < menuOptions.length;i++){
				currentWidth = font.stringWidth(menuOptions[i]);
				if(currentWidth > menuMaxWidth)
					menuMaxWidth = currentWidth;
				
				menuMaxHeight += fontHeight + padding;   //菜单的高度,没加一个菜单选项相应的加一个字体高度和距离
			}
			
			menuMaxWidth +=6*padding;  //设置宽度加上6个间距
			g.setColor(bgColor);
			g.fillRoundRect(0, //x
					height - fontHeight -menuMaxHeight -2*padding,//y
					menuMaxWidth, menuMaxHeight, 10, 10); //绘制圆角弹出框
			
			g.setFont(font);
			int menuOptionX = 3*padding; //菜单选项的初始横坐标
			int menuOptionY = height - fontHeight - 2*padding -menuMaxHeight + padding;  //菜单选项的初始纵坐标
			
			//为每个菜单添加一条线的循环
			for(int i=0; i <= menuOptions.length ; i++)
			{
				g.setColor(heighLight);  //被选中的选框颜色
				int lineOptionY = height - fontHeight - 2*padding -menuMaxHeight + i*(fontHeight + padding); //在菜单之间加一条线
				g.drawLine(0, lineOptionY, menuMaxWidth -1,lineOptionY );
			}
			
			//画菜单项的循环
			for(int i = 0; i < menuOptions.length; i++){
				if(i != select){  //如果没被选中,则为默认显示
					g.setColor(defaulFontColor);  
					g.drawString(menuOptions[i], menuOptionX , menuOptionY , g.LEFT|g.TOP);
				}
				else{    //菜单被选中时的颜色显示
					g.setColor(heighLight);  //选中时的颜色
					int heightY = height - fontHeight - 2*padding - menuMaxHeight + i*(fontHeight + padding); //
					g.fillRoundRect(0, heightY, menuMaxWidth, fontHeight + padding, 10, 10);
					g.setColor(selectedFontColor);
				     g.drawString(menuOptions[i], menuOptionX, menuOptionY, g.LEFT
				       | g.TOP);
				}
				menuOptionY += padding + fontHeight;   //画完一个菜单之后坐标下移
			}
			canvas.flushGraphics();  //将设置的信息全部显示到屏幕
		}
		
	}
}



下面是控制桌面显示绘图的类

 

MenuAction类

package karant.zhan;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.midlet.MIDletStateChangeException;

public class MenuAction extends GameCanvas{

	static int width;  //屏幕宽
	static int height; //屏幕高
	
	static final String[] menuOptions = {"状态设置","聊天记录","好友管理","系统设置","注销","帮助","关于"};    //菜单选项
	static int menuChoose;   //用于记录按下确定键的菜单位置
	private int select = 0;  //当前选中的按键的索引值
	private boolean menuIsActive = false;   //手机是否处在菜单选着状态中,初始化为否
	private DrawMenuMIDlet menumidlet;     //MIDlet对象
	private String leftOption;
	private String rightOption;
	private Graphics g;
	private MenuCanvas menu;
	private int LEFT_KEY = -6; //手机左功能键
	private int RIGHT_KEY = -7;  //手机右功能键
	
	public MenuAction(DrawMenuMIDlet menumidlet) {
		super(false);
	    this.menumidlet = menumidlet;
	    
	    //获取屏幕的宽高
	    width = getWidth();
	    height = getHeight();
	    
	    setFullScreenMode(true);  //设置全屏
	    
	    menuChoose = 0;  //初始化
	    g = getGraphics();  //获得画笔
	    leftOption = "菜单";  //设置左边显示菜单
	    rightOption = "退出";  //设置右边显示退出
	    
	    menu = new MenuCanvas(leftOption , rightOption, menuOptions); //初始化界面
	    
	    start();   //初始化屏幕你内容
	    menumidlet.display.setCurrent(this);
	}

	public void start(){
		clearScreen();  //清屏
		menu.drawInactiveMenu(this,g);   //菜单初始模版设置
	}
	
	public void clearScreen(){
		g.setColor(0xedffff);  //设置背景颜色
		g.fillRect(0, 0, width, height);  //填充屏幕
		flushGraphics();    //刷新屏幕
	}
	
	protected void keyPressed(int keyCode){
		if(menuIsActive){    //为真时当进入了菜单选项
			if(keyCode == RIGHT_KEY){  //如果按了返回
				clearScreen();   //清理屏幕
				menu.drawInactiveMenu(this, g);
				menuIsActive = false;
			}
			keyCode = getGameAction(keyCode);
			if(keyCode == UP)  // 按下向上键
			{
				select--;
				if(select < 0)
					select = 0;
				menu.drawActiveMenu(this, g, select);
			}
			else if(keyCode == DOWN)   //按下向下键
			{
				select++;
				if(select > 6)
					select = 6;
			
			menu.drawActiveMenu(this, g, select);  //重新绘制目录选择状态
		}
			else if(keyCode == FIRE){   //按了确定键
				clearScreen();  //清屏
				g.setColor(0,0,0);  //设置显示颜色
				g.drawString("你选择了: " + menuOptions[select], 10, 15, g.LEFT|g.TOP);
				menu.drawInactiveMenu(this, g);  //返回初始界面
				menuIsActive = false;
		}
		}
		else{
			if(keyCode == LEFT_KEY){   //当菜单键按下
				menu.drawActiveMenu(this, g, select);
				menuIsActive = true;
			}
			else if(keyCode == RIGHT_KEY){  //退出
				try {
					menumidlet.destroyApp(false);
				} catch (MIDletStateChangeException e) {
					e.printStackTrace();
				}
				menumidlet.notifyDestroyed();
			}
		}
	}
	
}


 

上传的照片不能用

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值