2025-05-23

昨天主管叫我做個菜單,我把題意理解錯瞭,也可以說是沒問清楚吧

開始做瞭個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();
   }
  }
 }
 
}


 

上傳的照片不能用

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *