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

📄 textfieldpopup.java

📁 J2me应用开发经典例子
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
      breakOffset++;
      textW += f.charWidth(c);
    }
    if (niceB > offset && niceB < offset + len - 2 && (text[niceB + 1] == ' '))
      return niceB + 2;        // case: special case to get rid of extra spaces
    else if (niceB > offset && niceB < offset + len)
      return niceB + 1;        // case: found a nice break, use this
    else if (breakOffset > offset + 1)
      return breakOffset - 1;  // case: broke due to text width too big
    else if (breakOffset == offset)
      return breakOffset + 1;  // case: broken on first char, step one more
    else
      return breakOffset;      // case: default
  }

  /**
   * Paints the popup. Call this from your <code>Displayable</code>'s
   * paint method.
   * 
   * @param g  Graphics context to paint on.
   */
  public void paint(Graphics g)
  {
	  System.out.println("enter TextFieldPopup::paint");
	  
	  try
	  {
		    if (m_active)
		    {
				/*m_display.setCurrent(
						new Alert(
								"提示", 
								"Popup>>1",
										null, AlertType.ERROR));
				Thread.sleep(2000);*/
				
		      // draw transparent background
		      for (int y = OFFSET_POPUP + m_yoffset; y < OFFSET_POPUP + m_yoffset + m_h; y += 8)
		      {
				  /*
				   * Math.min(8,OFFSET_POPUP + m_yoffset + m_h - y)
		            在CLDC1.0下无法运行,所以必须修改.
		            zhengyun 20051216
				   */
		      	int nTemp = OFFSET_POPUP + m_yoffset + m_h - y;
		      	nTemp = 8>nTemp ? nTemp:8;
		        g.drawRGB(m_rgbData, 0, m_w, OFFSET_POPUP, y, m_w, nTemp, true);
		      }
		
		      // border
		      g.setColor(m_borderColor);
		      g.drawRect(OFFSET_POPUP, OFFSET_POPUP + m_yoffset, m_w, m_h);
			  /*System.out.println("OFFSET_POPUP=" + OFFSET_POPUP +
					  ";m_yoffset=" + m_yoffset + 
					  ";m_w=" + m_w +
					  ";m_h=" +m_h);*/
		
			  ////////////////////////////////////////////////////////////////////////
			  /*
			   * zhengyun 20051220
			   * 尝试画一个文本输入框;
			   */
			  // drawRect(int x, int y, int width, int height) 
			  g.setColor(m_borderColor);
		      g.drawRect(OFFSET_POPUP + 2, OFFSET_POPUP + m_yoffset + 1, m_w - 5, 
					  m_fontHeight - 1);
			  g.setColor(m_textColor);
			  g.drawRect(OFFSET_POPUP + 3, OFFSET_POPUP + m_yoffset + 2, m_w - 6, 
					  m_fontHeight - 2);
			  // 绘制编辑框内的背景色,稍微浅色点
			  for (int y = OFFSET_POPUP + m_yoffset + 2; 
			  		y < OFFSET_POPUP + m_yoffset + m_fontHeight - 1; y += 4)
		      {
		      	int nTemp = OFFSET_POPUP + m_yoffset + m_fontHeight - y;
		      	nTemp = 4>nTemp ? nTemp:4;
				// public void drawRGB(int[] rgbData, int offset, int scanlength, int x, int y, int
				// width, int height, boolean processAlpha). 
		        g.drawRGB(m_rgbTextFieldData, 0, m_w - 6,
						OFFSET_POPUP + 3, y, m_w - 6, nTemp, true);
		      }
			  // getFormattedText返回的char数组总是最大限制输入数值个字符的长度,而不是用户输入的字符的长度
			  char[] text = getFormattedText(SCROLLABLE);
			  // 所以必须截断:
			  String strText = String.valueOf(text).trim();
	          int cursorOffset = calculatedCursorOffset;
	          int caretPosition = calculatedCaretPosition;
	          int curLen = currentLength;
			  if (strText.length() != 0) {
				  System.out.println("getFormattedText>>" + strText);
				  // drawChars(char[] data,int offset,int length,int x,int y,int anchor)
				  g.setColor(m_selectedAlternativeColor);
				  g.setFont(m_font);
				  int nCharWidth = 
					  m_font.charsWidth(strText.toCharArray(), 0, strText.length()) >> 1;
				  int nEditX = OFFSET_POPUP + OFFSET_TEXT + 
					  (m_w / (m_alternatives + 1))
					  - nCharWidth;
				  g.drawChars(text, 0, text.length, 
						  nEditX, OFFSET_POPUP + m_yoffset + m_fontHeight + 1, 
						  Graphics.BOTTOM | Graphics.LEFT);
			  }
			  //
			  //////////////////////////////////////////////////////////////////////////
				
		      // text
		      g.setColor(m_textColor);
		      g.setFont(m_font);
		      //int y = OFFSET_POPUP + OFFSET_TEXT + m_yoffset;
			  int y = OFFSET_POPUP + OFFSET_TEXT + m_yoffset + m_fontHeight + 2;
			  
			  /*
			   * Math.min(m_curLine + m_visibleLines, m_breakTextData.length)
			   * 不能在CLDC1.0上运行.
			   * zhengyun 20051216
			   */
			  int nTemp1 = m_curLine + m_visibleLines;
			  int nTemp2 = m_breakTextData.length;
		      int maxLine =
				  nTemp1 > nTemp2 ? nTemp2 : nTemp1;
		      for (int i = m_curLine; i < maxLine; i++)
		      {
		        int offset = m_breakTextData[i][0];
		        int len = m_breakTextData[i][1];
		        if (len == 1 && m_text[offset] == NEWLINE)
		        {
		          y += m_fontHeight;
		        }
		        else
		        {
		          if (m_text[offset + len - 1] == NEWLINE)
		          {
		            len--;
		          }
		          g.drawChars(m_text, offset, len, OFFSET_POPUP + OFFSET_TEXT
		              + (m_w >> 1), y, Graphics.TOP | Graphics.HCENTER);
				  
		          y += m_fontHeight;
		        }
		      }
		
		      // scrollbar
		      if (m_visibleLines < m_breakTextData.length)
		      {
		        int sbh = m_visibleLines * m_fontHeight;   // Scrollbar max height
		        int sbstep = ((sbh - 4) << 8) / m_maxLine; // Scrollbar height * 256
		        int sbX =
		          OFFSET_POPUP + m_w - SB_WIDTH - (SB_WIDTH >> 1); // Scrollbar x-coordinate
		        g.setColor(m_textColor);
		        g.fillRect(sbX, OFFSET_POPUP + OFFSET_TEXT + ((m_curLine * sbstep) >> 8),
		          SB_WIDTH, 4 + (sbstep >> 8));
		      }
		
		      // alternatives
		      if (m_alternatives > 0)
		      {
		        y =
		          OFFSET_POPUP + OFFSET_TEXT + m_h + m_yoffset - OFFSET_TEXT - m_fontHeight;
		        int dx = (m_w / (m_alternatives + 1));				
		        int x = OFFSET_POPUP + OFFSET_TEXT;
				System.out.println("Alternative>>dx=" + dx
						  + ";x=" + x);
		        for (int i = 0; i < m_alternatives; i++)
		        {
		          char[] t = m_altTexts[i];
		          x += dx;
				  int nTWidth = m_font.charsWidth(t, 0, t.length) >> 1;
				  System.out.println("Alternative>>nTWidth=" + nTWidth
						  + ";x=" + x);
		          int xx = x - nTWidth;
				     
				     /*
					 * zhengyun 20051220 added
					 * 添加OK按钮上的背景色
					 */
					  System.out.println("添加OK按钮上的背景色!");
					  g.setColor(m_borderColor);
					  g.drawRect(OFFSET_POPUP + 2, y, m_w - 5, m_fontHeight - 1);
					  g.setColor(m_textColor);
					  g.drawRect(OFFSET_POPUP + 3, y + 1, m_w - 6, m_fontHeight - 2);
					  // 绘制编辑框内的背景色,稍微浅色点
					  for (int yAlternative = y + 1; yAlternative < y + m_fontHeight - 1; yAlternative += 4)
				      {
				      	int nTemp = y + m_fontHeight - yAlternative;
				      	nTemp = 4>nTemp ? nTemp:4;
						// public void drawRGB(int[] rgbData, int offset, int scanlength, int x, int y, int
						// width, int height, boolean processAlpha). 
				        g.drawRGB(m_rgbButtonData, 0, m_w - 6,
								OFFSET_POPUP + 3, yAlternative, m_w - 6, nTemp, true);
				      }
					  
		          if (m_curAlt != i)
		          {
					  System.out.println("Unselected alternative>>xx=" + xx
							  + ";y=" + y);
		            // Unselected alternative
		            g.setColor(m_alternativeColor);
		            g.drawChars(t, 0, t.length, xx, y, Graphics.TOP | Graphics.LEFT);
		          } 
		          else
		          {
					  System.out.println("Selected alternative>>xx=" + xx
							  + ";y=" + y);
						  
		            // Selected alternative
		            g.setColor(m_alternativeColor);
		            g.drawChars(t, 0, t.length, xx + 1, y + 1,
		                Graphics.TOP | Graphics.LEFT);
		            g.setColor(m_selectedAlternativeColor);
		            g.drawChars(t, 0, t.length, xx, y, Graphics.TOP | Graphics.LEFT);					
					
		          }
		        }
		      }
		    }
	  }
	  catch(Exception exc)
	  {
		  m_display.setCurrent(
					new Alert(
							"错误", 
							"Popup.paint:"
									+ exc.getMessage() + "/" + exc.getClass(),
									null, AlertType.ERROR));
	  }
  }

  /**
   * Handles user interaction when pressing a key.
   * Call this from your <code>Displayable</code>'s
   * keyPressed keyRepeated method.
   * 
   * @param keyCode  The keycode.
   * @param gameCode The gamecode.
   */
  public void keyPressed(int keyCode, int gameCode)
  {
	  System.out.println("enter textfieldpopup::keypressed>>keyCode=" + 
			  keyCode + ">>gameCode=" + gameCode);
	  
    if (m_active)
    {
      if (m_alternatives < 1)
      {
        // If no choice, any key will do
        m_active = false;
        if (m_listener != null)
		{
          m_listener.selectedChoice(m_curAlt, false);
		  return;
		}
      }
	  else
      {
		  
        switch (gameCode)
        {
	        // Scroll text
	        case Canvas.DOWN:
	        {
	          m_curLine++;
	          if (m_curLine >= m_maxLine)
	            m_curLine = 0;
	          break;
	        }
	        case Canvas.UP:
	        {
	          if (m_maxLine > 0)
	            m_curLine--;
	          if (m_curLine < 0)
	            m_curLine = m_maxLine - 1;
	          break;
	        }
	        // Select among choices
	        case Canvas.RIGHT:
	        {
	          m_curAlt++;
	          if (m_curAlt >= m_alternatives)
	            m_curAlt = 0;
	          break;
	        }
	        case Canvas.LEFT:
	        {
	          m_curAlt--;
	          if (m_curAlt < 0)
	            m_curAlt = (byte) (m_alternatives - 1);
	          break;
	        }
	        /*case Canvas.FIRE:
	        {
				 System.out.println("click fire>>m_clickEventID=" + m_clickEventID);
	          // Select
				 // 下面这句话是我注释的,因为FIRE之后却发现m_curAlt >= 0条件并不满足
	          //if (m_curAlt >= 0)
	          {
	            m_active = false;
	            if (m_listener != null)
	              m_listener.selectedChoice((byte)m_clickEventID, false);
	          }
	          break;
	        }*/
	        case Device.KEYCODE_BACK:
	        {
	          m_active = false;
	          if (m_listener != null)
	            m_listener.selectedChoice(m_timeOutAlt, false);
	          break;
	        }
        }
		
		/*
		 * 由于Nokia手机的5按键用gameCode的话,就对应到了Canvas.FIRE,这是我们不能接受的
		 * 必须使用keyCode来处理
		 * zhengyun added 20051227
		 */
		if(keyCode == PlatformCanvas.KEY_FIRE)
		{
			  System.out.println("click fire>>m_clickEventID=" + m_clickEventID);
	          // Select
				 // 下面这句话是我注释的,因为FIRE之后却发现m_curAlt >= 0条件并不满足
	          //if (m_curAlt >= 0)
	          {
	            m_active = false;
	            if (m_listener != null)
				{
					m_listener.selectedChoice((byte)m_clickEventID, false);
					// 剩下的处理就不用了
					return;
				}
	          }
		}
      }
	  
	  //////////////////////////////////////////////////////
	  /*
	   * 处理按键 zhengyun 20051220
	   */
	  boolean bRes = false;
	  resetCursor();
      if (!insertMode && preProcessKeyCode(keyCode)) {
          composer.caretRight();
      }
      final boolean curInsertMode = insertMode;

      if (keyCode == PlatformCanvas.KEY_LEFT) {
          bRes = composer.caretLeft();
      }
      if (keyCode == PlatformCanvas.KEY_RIGHT) {
          bRes = composer.caretRight();
      }

      if (editable) {

          if (keyCode == PlatformCanvas.KEY_STAR || keyCode == PlatformCanvas.KEY_CLEAR) {
              bRes = composer.backspace();
          }

          if (keyCode == PlatformCanvas.KEY_POUND || (keyCode >= PlatformCanvas.KEY_NUM0 && keyCode <= PlatformCanvas.KEY_NUM9)) {

              char ch = processKeyCode(keyCode);
			  System.out.println("processKeyCode return>>" + String.valueOf(ch));
              if (ch == 0) return ;
              bRes = composer.addChar(ch, curInsertMode);
              if (insertMode) composer.caretRight();
          }
      }
	  initCursor();
	  lastKeyCode = keyCode;
	  ///////////////////////////////////////////////////////////
	  
    }
  }
  protected void resetCursorHandler() {

      insertMode = true;
      charOptionCounter = 0;
  }
  /**
   * Blinking rate for the curson in milliseconds
   */
  protected static final int CURSOR_DELAY = 1000;
  /**
   * The timer is used to determine if key input time is elapsed
   */
  protected Timer cHandler = null;
  /**
   * Cancels the timer
   */
  synchronized protected void resetCursor()
  {
      if (cHandler != null)
      {
          cHandler.cancel();
          cHandler = null;
      }
  }
  /**
   * Initializes new timer
   */
  protected void initCursor()
  {
      if (!insertMode)
      {
          cHandler = new Timer();
          cHandler.schedule(new CursorHandler(), CURSOR_DELAY);
      }
  }
  /**
   * The timer task, when elapsed cursor moves to next position
   */
  class CursorHandler extends TimerTask
  {
      public CursorHandler()
      {
      }

⌨️ 快捷键说明

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