📄 menubarcanvas.java
字号:
* setClip方法意思是:
* Sets the current clip to the rectangle specified by the given coordinates.
* Rendering operations have no effect outside of the clipping area.
*/
g.setClip(0, 0, getWidth(), getHeight());
/*
* 按照给定的菜单哈希表逐个绘制
*/
Enumeration menus = menutable.elements();
int menunum = menutable.size(); // 这是菜单个数
System.out.println("菜单个数=" + menunum);
int i = menunum - 1;
while (menus.hasMoreElements())
{
// 提取菜单项
MenuItem menuitem = (MenuItem) menus.nextElement();
if (selectedid == i)
{
// 当前这个菜单是被选中的菜单
System.out.println("当前选中的菜单=" + i);
// 背景色是有区别的
g.setColor(m_SelectedMenuItemFillRectColor);
// 画出菜单的背景色来
g.fillRect(menuitem.offx + 1, menuitem.offy + 1,
m_MenuItemWidth - 1, m_MenuItemHeight - 1);
// 画出菜单的边框来
g.setColor(m_SelectedMenuItemBorderColor);
g.drawRect(menuitem.offx, menuitem.offy, m_MenuItemWidth,
this.m_MenuItemHeight);
}
else
{
// 当前这个菜单没有被选中
System.out.println("当前没有选中的菜单=" + i);
g.setColor(m_UnselectedMenuItemFillRectColor);
g.fillRect(menuitem.offx + 1, menuitem.offy + 1,
m_MenuItemWidth - 1, m_MenuItemHeight - 1);
g.setColor(m_UnselectedMenuItemBorderColor);
g.drawRect(menuitem.offx, menuitem.offy, m_MenuItemWidth,
m_MenuItemHeight);
}
// 这是菜单的标题
//
String showstr = menuitem.menustr;
System.out.println("菜单标题=" + showstr);
/*
* 设置字体
*/
g.setFont(
Font.getFont(Font.FACE_PROPORTIONAL,
Font.STYLE_BOLD,
Font.SIZE_LARGE));
g.setColor(m_SelectedMenutextColor);
// 绘制菜单标题
/*
* drawString Parameters:
str - the String to be drawn
x - the x coordinate of the anchor point
y - the y coordinate of the anchor point
anchor - the anchor point for positioning the text
*/
// (menuitem.offy + 1)不要太大了,否则标题会很靠近边框的
g.drawString(showstr, menuitem.offx + 3, menuitem.offy + 1,
20);
//System.out.println("x=" + (menuitem.offx + 3));
//System.out.println("y=" + (menuitem.offy + 1));
// 如果该菜单还有子菜单,那么就写一个">"标示出来:
if (menuitem.hasIssue)
{
g.drawString(">", menuitem.offx + m_MenuItemWidth - 5,
menuitem.offy + 3, 20);
}
i--;
menuitem = null;
}
menus = null;
// 画背景图:
/*System.out.println("画背景图.");
drawImageEx(g, FrameImg, 3, 181, 3, 181, 33, 21);
drawImageEx(g, FrameImg, 139, 181, 139, 181, 33, 21);
g.setClip(0, 0, getWidth(), getHeight());*/
//////////////////////////////////////
// 绘制简单的左右软键的菜单
// 现交给特定类SoftButtonControl来处理了
/*if(showMenu)
{
System.out.println("画菜单.");
g.setColor(0);
g.drawString("[选择]", 8, getHeight() - g.getFont().getHeight() - 8,
20);
g.drawString("[取消]",
getWidth() - g.getFont().stringWidth("[取消]") - 8,
getHeight() - g.getFont().getHeight() - 8, 20);
}*/
//////////////////////////
}
/**
* 画图
* @param g 图形设备
* @param image 图片缓冲
* @param destX 屏幕坐标
* @param destY 屏幕坐标
* @param srcX 图片坐标
* @param srcY 图片坐标
* @param width 绘图尺寸
* @param height 绘图尺寸
*/
public void drawImageEx(Graphics g, Image image, int destX,
int destY, int srcX, int srcY, int width,
int height)
{
System.out.println("Enter drawImageEx!");
if(image == null)
{
System.out.println("image(图片缓冲) is empty!");
return;
}
if(g == null)
{
System.out.println("g(图形设备) is empty!");
return;
}
g.setClip(destX, destY, width, height);
g.drawImage(image, destX - srcX, destY - srcY, 0);
}
/**********************************************************
// MenuBarCanvas::keyPressed()
//
// Description:
// 处理按键:
* 1.如果当前已经有菜单在显示了,那么就把处理权交给MenuKeyPressed
* 2.否则我们只处理左右软键;
//
// Parameters:
* keyCode - 按键值
// Return Values:
// Author:
// zhengyun@ultrapower 2006.02.13
//
**********************************************************/
public void keyPressed(int keyCode)
{
System.out.println("Enter KeyPressed!keyCode=" + keyCode +
";showMenu=" + m_showMenu);
if (m_showMenu)
{
// 如果当前已经有菜单在显示了,那么就把处理权交给MenuKeyPressed
System.out.println("有按键被按下,showMenu又为true!");
MenuKeyPressed(keyCode);
return;
}
// 否则我们只处理左右软键
if (keyCode == PlatformCanvas.KEY_SOFT_LEFT)
{
m_showMenu = !m_showMenu;
System.out.println("左软按键被按下,showMenu=" + m_showMenu);
if (m_showMenu)
{
// 显示菜单:
System.out.println("showMenu为true,调用updateMenuBar。");
updateMenuBar();
// 将左软键改为"选择"
m_softButtons.setLeftCommand(CMD_SELECT);
// 将右软键改为"取消"
m_softButtons.setRightCommand(CMD_CANCEL);
}
else
{
// 关闭菜单
System.out.println("showMenu为false,关闭菜单。");
CloseMenuBar();
}
}
else if (keyCode == PlatformCanvas.KEY_SOFT_RIGHT) // 退出程序
{
// 既没有显示菜单,那么当下这个右键应该是“退出应用”的命令,所以
// 应该调用midlet的退出函数了
System.gc(); // 通知进行垃圾收集
Thread.yield(); // 本线程暂停一下,使得GC可以马上获得机会运行
m_midlet.exit(false);
}
}
/**********************************************************
// MenuBarCanvas::MenuKeyPressed()
//
// Description:
// 在菜单被按出来之后,我们将按键都传给这个函数处理
//
// Parameters:
* keyCode - 按键值
// Return Values:
// Author:
// zhengyun@ultrapower 2006.02.13
//
**********************************************************/
public void MenuKeyPressed(int keyCode)
{
System.out.println("Enter MenuKeyPressed!keyCode=" + keyCode);
switch (keyCode)
{
case PlatformCanvas.KEY_SOFT_RIGHT:
{
if(!m_showMenu)
{
System.out.println("退出应用!");
// 只有当菜单不显示的时候,我们才让点击右软键代表退出应用
System.gc(); // 通知进行垃圾收集
Thread.yield(); // 本线程暂停一下,使得GC可以马上获得机会运行
m_midlet.exit(false);
}
else
{
// 关闭菜单
CloseMenuBar();
}
break;
}
case PlatformCanvas.KEY_UP: //up
{
System.out.println("up!");
m_MenuSelectedIndex--;
// 不加上这个repaint(),便无法使得被选中的菜单背景色变化
repaint();
break;
}
case PlatformCanvas.KEY_DOWN: //down
{
System.out.println("down!");
m_MenuSelectedIndex++;
// 不加上这个repaint(),便无法使得被选中的菜单背景色变化
repaint();
break;
}
case PlatformCanvas.KEY_LEFT: //left
{
//缩进子菜单
if (m_MenuBarTable != null)
{
int id = m_selectedBarID;
m_MenuBarTable = null;
// 由于绘制菜单时,drawMenu仍然会遍历MenuTable,试图绘制出所有的菜单项;
// 所以我们必须预先将MenuTable中的菜单重置,以防止又重新把主菜单和子菜单画出来了。
updateMenuBar();
m_MenuSelectedIndex = id;
System.out.println("缩进子菜单!id=" + id);
}
// 不加上这个repaint(),便无法使得缩进菜单
repaint();
break;
}
case PlatformCanvas.KEY_RIGHT: //right
{
MenuItem mi = this.getSelectedMenuItem();
if (mi != null && mi.hasIssue) //展开子菜单
{
System.out.println("展开子菜单>>" + mi.menustr);
MenuKeyPressed( -5);
}
// 不加上这个repaint(),便无法使得展开菜单
//repaint();
break;
}
case PlatformCanvas.KEY_SOFT_LEFT:
{
///////////////////////////////////////////////////
// 这是一种风格:
// 有点类似于ucweb或者MS Windows的风格,点击一次左软键,代表展开菜单;
// 再点击一次,则代表关闭菜单.
/*
* 如果是当前菜单已经出来了,那么再点击左软键代表要关闭菜单;
* 如果是当前没有绘制菜单,那么点击左软键代表要展开菜单;
*/
/*if(showMenu)
{
System.out.println("再点击左软键代表要关闭菜单!");
// 当前菜单已经出来了
MenuTable = null;
MenuBarTable = null;
}
else
{
System.out.println("点击左软键代表要展开菜单!");
// 当前没有绘制菜单
MenuKeyPressed(-5);
}
showMenu = !showMenu;
repaint();*/
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
// 这是另外一种风格:
// 有点类似于Opera mini的风格,点击一次左软键,代表展开菜单;
// 再点击一次,则代表选中菜单上的被选项,要么执行该菜单命令,要么展开子菜单.
// 此时,左软键就代表Fire键
MenuKeyPressed(-5);
/////////////////////////////////////////////////////
break;
}
case PlatformCanvas.KEY_FIRE:
{
System.out.println("fire!");
// 此时的Fire键意思很明确,
// 要么执行该菜单命令,要么展开子菜单.
doMenuHandle();
break;
}
default:
{
// 一个小技巧:
// 如果用户按的是数字键,则代表直接根据数字选主菜单中对应的那一个菜单;
// 也是两种情况:要么执行该菜单命令,要么展开子菜单.
if (keyCode > 48 && keyCode <= 57)
{
System.out.println("数字键直接选菜单!");
if ( (keyCode - 49) < m_MenuTable.size())
{
m_MenuSelectedIndex = keyCode - 49;
doMenuHandle();
}
}
break;
}
}
}
/**********************************************************
// MenuBarCanvas::CloseMenuBar()
//
// Description:
// 关闭菜单,如果它显示了的话;
* 修改左右软键的标题
//
// Parameters:
// Return Values:
// Author:
// zhengyun@ultrapower 2006.02.13
//
**********************************************************/
void CloseMenuBar()
{
// 关闭菜单
m_showMenu = false;
m_MenuTable = null;
m_MenuBarTable = null;
System.out.println("关闭菜单!");
// 将左软键改为"开始菜单"
m_softButtons.setLeftCommand(CMD_MAINMENU);
// 将右软键改为"退出应用"
m_softButtons.setRightCommand(CMD_EXIT);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -