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

📄 menubarcanvas.java

📁 使用j2me实现二级菜单
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
			   * 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 + -