J2me-UI设计(网址输入框)

package mvc.mobile.util.ui;

 

import java.util.TimerTask;

 

import javax.microedition.lcdui.*;

import mvc.mobile.util.ui.timer.*;

import mvc.mobile.util.ui.setting.Platform;

import javax.microedition.rms.RecordEnumeration;

import javax.microedition.rms.RecordStore;

import mvc.mobile.test.Filter;

import mvc.mobile.test.Comparator;

import javax.microedition.rms.*;

import javax.microedition.rms.*;

import java.util.Vector;

import javax.microedition.io.HttpConnection;

import mvc.mobile.util.net.DataCanvas;

import mvc.mobile.util.net.HttpRequest;

import mvc.mobile.util.net.HttpWaitUI;

 

/**

 *@(#)TextField.java

 * 版权声明 , 版权所有 违者必究

 * 版本号  1.0

 * 功能描述:

 *       实现TextBox的功能,具有输入网址时候根据历史匹配提示的功能

 *       默认情况下,字符之间,横向间隔2px,纵向间隔1px

 *修订记录:

 *1)更改者:李培

 *  时 间:2009-12-31

 *  描 述:创建

 */

 

public class TextBox

    extends Item implements Runnable, javax.microedition.lcdui.CommandListener {

  private javax.microedition.lcdui.Command okCommand = new javax.microedition.

      lcdui.Command("OK", javax.microedition.lcdui.Command.SCREEN, 1);

  private int maxSize; //最多可见的字符数

  private char[] textChars; //内容 in characters

  private String[] iHistoryUrl;

  private String text = null; // 内容 in String

  private int numOfVisible;

 

  boolean TextOrPassword = false; // false为文本,true为密码

  private TimerTask task; //定时器用于实现闪动的光标

  private TextBoxStub stub; //使用内部类实现多继承

 

  // 针对本程序需要定义的URL变量

  private String url = null;

  public String getUrl() {

    return url;

  }

 

  private boolean isflicker = false;

 

  class TextBoxStub

      extends javax.microedition.lcdui.TextBox {

    public TextBoxStub(String title, String text, int maxSize, int constraints) {

      super(title, text, maxSize, constraints);

      addCommand(okCommand);

      addCommand(cancelCommand);

    }

  }

 

  public TextBox(String label, String text, int maxSize, boolean type ,  ItemCanvas canvas) {

    super(0, 20, 0, 0);

    this.canvas = canvas ;

    this.maxSize = maxSize;

    if (label == null)

      this.label = "";

    else

      this.label = label;

    setType(type);

    setText(text);

 

    stub = new TextBoxStub("请输入", text, maxSize,

                           type ? TextField.PASSWORD : TextField.ANY);

    stub.setCommandListener(this);

   

    try {

    /**

     * 打开RMS操作

     */

      RecordStore sRecordStore = RecordStore.openRecordStore(

          "myHistoryUrlStore", true);

      /**

       *把字符串类型数据写入RMS的操作

       */

      String[] sOutputData = {"http://www.baidu.com","http://www.g.cn","http://www.uc.cn","http://www.sysu.com","http://www.bidu.com"};

        for(int i =  0 ; i < sOutputData.length ; i++){

          byte[] sByteOutputData = sOutputData[i].getBytes();

          sRecordStore.addRecord(sByteOutputData,0,sByteOutputData.length);

        }

 

      /**

       * 把字符串类型数据读入数组的操作

       */

      Filter sfilter= new Filter("http://www."); //防止错误信息出现

      Comparator sComparator = new Comparator();

      RecordEnumeration sRecordEnumeration = sRecordStore.enumerateRecords(sfilter,

          sComparator, false);

      int i = 0;

      iHistoryUrl = new String[sRecordEnumeration.numRecords()];

      while (sRecordEnumeration.hasNextElement()) {

        iHistoryUrl[i++] = new String(sRecordEnumeration.nextRecord());

      }

      sRecordEnumeration.destroy();

      sRecordStore.closeRecordStore();

 

    }

    catch (RecordStoreException ex) {

      Alert sAlert = new Alert("Error opening RMS", ex.toString(), null,

                               AlertType.WARNING);

      sAlert.setTimeout(Alert.FOREVER);

      display.setCurrent(sAlert);

 

    }

 

   

      loadHistory(text);

   

   

 

    

   

  }

  private Vector iShowHistory = new Vector() ; //下拉菜单显示的历史网址

  /**

   * 用输入的字符串寻找匹配的历史网址

   * @param aUrl String

   * @throws Exception

   */

  private void loadHistory(String aUrl)  {

        boolean sFound = false;

        iShowHistory.removeAllElements();

       for(int i = 0 ; i< iHistoryUrl.length ;i++){

          if( iHistoryUrl[i].startsWith(aUrl)){

            iShowHistory.addElement(iHistoryUrl[i]);

            sFound = true ;

          }else{

             if(sFound)

               break;

          }

       }

 

  }

 

 

 

 

  public void setText(String text) {

    if (text == null)

      this.text = "";

    this.text = text;

    textChars = text.toCharArray();

    if (textChars.length > maxSize)

      numOfVisible = maxSize;

    else

      numOfVisible = textChars.length;

    url = text;

    position[HEIGHT] = font.getHeight();

 

  }

 

  public void setType(boolean type) {

    TextOrPassword = type;

  }

 

  public void paint(Graphics graphics) {

    /**

     * 绘画过程分两个部分

     * 1.画左侧标签

     * 2.画输入框

     */

 

    font = graphics.getFont();

    graphics.setColor(fontColor);

    paintLabel(graphics);

    paintText(graphics);

 

  }

 

  /**

   * paintText

   *

   * @param graphics Graphics

   */

  private void paintText(Graphics graphics) {

    int xPos = position[X] + font.stringWidth(label) + 2; //绘画text必须发生在绘画标签之后

    int yPos = position[Y];

    if (TextOrPassword) {

      xPos = paintPassword(graphics, xPos, yPos);

    }

    else {

      xPos = paintPlainText(graphics, xPos, yPos);

    }

    paintCursor(xPos + 2, yPos + 1, graphics);

  }

 

  /**

   * paintCursor

   *

   * @param i int

   * @param i1 int

   * @param graphics Graphics

   */

  private void paintCursor(int xPos, int yPos, Graphics graphics) {

    activateTask();

    graphics.setColor(0x3112323);

    if (hasFocus && isflicker) {

      graphics.drawChar('|', xPos, yPos, Graphics.TOP | Graphics.LEFT);

 

    }

 

  }

 

  /**

   * activateTask

   */

  private void activateTask() {

    if (hasFocus && null == task) {

 

      task = TimerTaskManager.getInstance().add(this, 300);

    }

    else if (!hasFocus && task != null) {

      task.cancel();

      task = null;

    }

  }

 

  //测试数据-- 测试通过,下一步从rms读入

  //private String[] iHistoryUrl = {"www.baidu.com","www.g.cn","www.ucweb.cn","www.baidu.com","www.g.cn","www.ucweb.cn","www.baidu.com","www.g.cn","www.ucweb.cn","www.baidu.com","www.g.cn","www.ucweb.cn"};

  private int iItemFocus = 0; //下拉菜单中选择的元素,需要高亮显示

  private boolean iIsDragDown = false;

  /**

   * paintDragDown

   * 画下拉框

   * @param graphics Graphics

   * @param charsWidth int

   * @param charsHeight int

   * @param startX int

   */

  private void paintDragDown(Graphics graphics, int charsWidth, int charsHeight,

                             int startX) {

    int yPos = charsHeight;

    if (hasFocus) {

      graphics.setColor(0x696969);

      for (int i = 0; i < iShowHistory.size(); i++) {

        if (i == iItemFocus) {

          graphics.setColor(0x90EE90);

          graphics.fillRect(startX, yPos, charsWidth, font.getHeight());

          graphics.setColor(0x696969);

        }

        graphics.drawString(iShowHistory.elementAt(i).toString(), startX + 2, yPos + 1,

                            Graphics.TOP | Graphics.LEFT);

        yPos = yPos + font.getHeight() + 2;

      }

      graphics.setColor(0x000000);

      graphics.drawRect(startX, charsHeight, charsWidth, yPos);

    }

  }

 

  /**

   * paintRect

   *画方框

   * @param graphics Graphics

   * @param xPos int

   * @param yPos int

   */

  private void paintRect(Graphics graphics, int charsWidth, int charsHeight,

                         int startX) {

    //注意的是 当输入框获得焦点的时候 里面要有多一个方框

    if (hasFocus) {

      graphics.setColor(0x0A24C3);

      graphics.drawRect(startX - 1, charsHeight - 1, charsWidth + 2,

                        font.getHeight() + 2);

    }

    else {

      graphics.setColor(fontColor);

    }

    graphics.drawRect(startX - 1, charsHeight - 1, charsWidth + 2,

                      font.getHeight() + 2);

  }

 

  /**

   * paintPassword

   * 绘画密码

   * @param graphics Graphics

   * @param xPos int

   * @param yPos int

   * @return int

   */

  private int paintPassword(Graphics graphics, int xPos, int yPos) {

    int startX = xPos;

    for (int i = 0; i < numOfVisible; i++) {

      graphics.drawChar('*', xPos + 2, yPos + 1, Graphics.TOP | Graphics.LEFT);

      xPos = xPos + font.charWidth(textChars[i]);

    }

    paintRect(graphics, xPos + 2, yPos + 1, startX);

    return xPos;

 

  }

 

  /**

   * 绘画文字plaintext

   * @param graphics Graphics

   */

  private int paintPlainText(Graphics graphics, int xPos, int yPos) {

    int startX = xPos;

    for (int i = 0; i < numOfVisible; i++) {

      graphics.drawChar(textChars[i], xPos + 2, yPos + 1,

                        Graphics.TOP | Graphics.LEFT);

      xPos = xPos + font.charWidth(textChars[i]);

    }

    paintRect(graphics, xPos + 2, yPos + 1, startX);

    if (iIsDragDown)

      paintDragDown(graphics, xPos + 2, yPos + font.getHeight() + 1, startX);

    return xPos;

 

  }

 

  /**

   * 画左侧标签

   * @param graphics Graphics

   */

  private void paintLabel(Graphics graphics) {

    if ("".equals(label) || null == label)

      return;

    else {

      graphics.drawString(label, position[X], position[Y] + 1,

                          Graphics.TOP | Graphics.LEFT);

    }

  }

 

  public void onClick(int keyCode) {

    if (!hasFocus) //如果当前画面的焦点不在输入框,则不处理键盘输入

      return;

    if (keyCode > 48 && keyCode < 58) {

      addText(keyCode);

    }

    else if (keyCode == Platform.KEY_CLEAR) {

      deleteText();

    }

    else if (keyCode == Platform.KEY_ENTER) {

      changeDragDown();

    }

    else if (keyCode == Platform.KEY_DOWN) {

      iItemFocus = (iItemFocus + 1) % (iShowHistory.size());

     

    }

    else if (keyCode == Platform.KEY_UP) {

      iItemFocus = iItemFocus > 0 ? (--iItemFocus) : (iShowHistory.size()- 1);

    }

    else if (keyCode == Platform.KEY_STAR) {

        //打开网络连接

        HttpRequest curRequest = new HttpRequest(text,HttpConnection.GET,null,null);

       HttpWaitUI wait = new HttpWaitUI(curRequest.getUrl(),new DataCanvas(((TextBoxCanvas)canvas).getMIDlet()),((TextBoxCanvas)canvas).getMIDlet());

      ((TextBoxCanvas)canvas).getMIDlet().getDisplay().setCurrent(wait);

 

     

    }

  }

 

  /**

   *  将这个方法使得下拉菜单展开或折叠

   */

  private void changeDragDown() {

  

      if (iIsDragDown) {

        text = (String)iShowHistory.elementAt(iItemFocus);

        setText(text);

      }else{

        loadHistory(text);

      }

      iIsDragDown = !iIsDragDown ;

    getCanvas().setTextBoxDragDown(iIsDragDown);

  }

 

  /**

   * openTextBox 将输入结果显示在TextBox

   *

   */

  private void openTextBox() {

    stub.setString(text);

    display.setCurrent(stub);

 

  }

 

  /**

   * deleteText 监视text的一个字符

   */

  private void deleteText() {

    text = text.substring(0, text.length() > 0 ? text.length() - 1 : 0);

    setText(text);

    loadHistory(text);

  }

 

  /**

   * addText 增加text的字符

   * 09-12-31  修改支持英文输入

   *           修改支持自动下拉菜单

   *

   * @param KeyCode int

   */

  private void addText(int keyCode) {

//        System.out.println("Text now is :" + text );

    if (text.length() > maxSize)

      return;

    int k = keyCode - 48;

    text += String.valueOf(k);

    setText(text);

     loadHistory(text);

  }

 

  public void commandAction(javax.microedition.lcdui.Command command,

                            Displayable displayable) {

    if (command == okCommand) {

      setText(stub.getString());

      url = stub.getString();

    }

    display.setCurrent(canvas);

 

  }

 

  public void run() {

    try {

      flicker();

    }

    catch (Exception e) {

    }

  }

 

  /**

   * flicker  定时器用于闪动光标

   */

  private void flicker() {

    isflicker = !isflicker;

    canvas.repaint();

  }

 

  /**

   * 标题栏高度 + 方框高度

   * @return int

   */

  public int getHeight() {

    return 20 + font.getHeight() + 2;

  }

 

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值