论坛首页 Java版 J2ME

[原创]J2ME自己画输入框界面(五)

浏览 2109 次
精华帖 (11) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-09-10
看了几个小时的M$ COM组件,看得累了。打开Eclipse看看J2ME,想了如何实现这个输入界面的问题了。:)

继承自 Canvas的类,如果想直接调用输入法是不可能。如果想获得英文获得数字,可以通过捕获键盘事件来获得,如果你有字典库通过几个键的组合,也可以获得一 个输入法,但是全世界那么多种语言,每个语言可能有不同的输入法,拿中文来说,就有拼音,五笔等输入法。你不可能在你的应用中把输入法这块花费那么大的时 间,当然除非你是做输入法的。在某些特殊情况下,比如我想在手机上产生俄罗斯文字,而且不需要系统额外安装俄罗斯输入法(暂且这么叫吧),我可以根据俄文 字典,根据用户当前按键来产生俄文字符。这样是可以的。

我们今天说的是另一个思路。

我们用界面的外观来模仿他,通过键盘时间来改变当前的控件。比如系统提供的TextBox是可以改变输入法的。

首先,在我们的界面上画出你的布局。输入框边界用灰色画出,有焦点时候用蓝色画出。

比如我的界面可能有两个输入框一个是手机号码字段,一个是内容字段。
我定义如下参数

TextBox[] m_textBoxs = new TextBox[2];
//两个控件对应的字符串,打开TextBox时把对应的字符串付给控件,完成输入的时候把控件的文字放到对应的字符串里面。
String[] m_strValues = new String[2];
//移动UP,DOWN 来控制当前选中的控件。
int p_currentIndex=-1;

为每个TextBox放置两个Command,"完成","后退"

图一:启动发送短信界面



(图二:这个界面都是画出来的,尽量模仿吧)



(图三:移动UP,DONW键效果,当前选中内容)


(图四 选中内容框,按下ok键,显示对应的TextBox,可以在里面输入)




(图五:按下完成键,真实手机还有一个界面,模拟器上没有,此时把控件里面的字符串放置到数组中,兵重新画图,如果文字多行,要考虑换行,如果高度超过矩形的高度,要出现滚动条)



(图六:发送界面,把手机号码涂改了一下,点发送菜单就可以发短信了。)





完毕,继续看M$ COM了.

代码:
//这个代码是来自FormCanvas的扩展的。


java 代码
 
  1. import javax.microedition.io.Connector;  
  2. import javax.microedition.lcdui.Alert;  
  3. import javax.microedition.lcdui.AlertType;  
  4. import javax.microedition.lcdui.Command;  
  5. import javax.microedition.lcdui.CommandListener;  
  6. import javax.microedition.lcdui.Displayable;  
  7. import javax.microedition.lcdui.Font;  
  8. import javax.microedition.lcdui.Graphics;  
  9. import javax.microedition.lcdui.TextBox;  
  10. import javax.microedition.lcdui.TextField;  
  11. import javax.wireless.messaging.MessageConnection;  
  12. import javax.wireless.messaging.TextMessage;  
  13.   
  14. import com.zhanglihai.j2me.event.IKeyListener;  
  15. import com.zhanglihai.j2me.event.IMenuItemListener;  
  16. import com.zhanglihai.j2me.ui.Component;  
  17. import com.zhanglihai.j2me.ui.Constants;  
  18. import com.zhanglihai.j2me.ui.FormCanvas;  
  19. import com.zhanglihai.j2me.ui.Header;  
  20. import com.zhanglihai.j2me.ui.KEvent;  
  21. import com.zhanglihai.j2me.ui.Menu;  
  22. import com.zhanglihai.j2me.ui.MenuBar;  
  23. import com.zhanglihai.j2me.ui.MenuItem;  
  24. import com.zhanglihai.j2me.ui.MenuItemEvent;  
  25.   
  26. /** 
  27.  * 

     

     
  28.  * Title: 
  29.  * 

     

     
  30.  * 

     

     
  31.  * Description: 
  32.  * 

     

     
  33.  * 

     

     
  34.  * Copyright: Copyright(c) 2007 
  35.  * 

     

     
  36.  * 

     

     
  37.  * Company 
  38.  * 

     

     
  39.  * 
  40.  * @project : j2me-framework 
  41.  * @author : zhanglihai 
  42.  * @home : http://www.zhanglihai.com 
  43.  * @email : zhanglihai.com@gmail.com 
  44.  * @date : 2007-9-7 
  45.  * @file : SmsSendForm.java 
  46.  * @version : 1.0 
  47.  * 
  48.  * $Id: SmsSendForm.java,v 1.0 2007/07/07 14:51:11 zhanglihai Exp $ 
  49.  */  
  50. public class SmsSendForm extends FormCanvas implements CommandListener,  
  51.   IKeyListener, IMenuItemListener {  
  52.   
  53.  private TestJ2MEFramework parent;  
  54.   
  55.  private TextBox mobileBox;  
  56.   
  57.  private Command cmdOk = new Command("完成", Command.OK, 1);  
  58.   
  59.  private Command cmdBack = new Command("后退", Command.BACK, 1);  
  60.   
  61.  private MenuBar menuBar = null;  
  62.   
  63.  private Header header = null;  
  64.   
  65.  private Component label = null;  
  66.   
  67.  private Menu mainMenu;  
  68.   
  69.  private MenuItem itemSend;  
  70.   
  71.  private MenuItem itemContent;  
  72.   
  73.  private int currentField = -1;  
  74.   
  75.  private TextBox contentBox = null;  
  76.   
  77.  private String[] m_strValues = new String[2];;  
  78.   
  79.  private TextBox[] m_textBoxs = new TextBox[2];  
  80.   
  81.  public SmsSendForm(final TestJ2MEFramework parent) {  
  82.   this.parent = parent;  
  83.   this.mobileBox = new TextBox("手机号码"""11, TextField.PHONENUMBER);  
  84.   this.mobileBox.addCommand(cmdOk);  
  85.   this.mobileBox.addCommand(cmdBack);  
  86.   mobileBox.setCommandListener(this);  
  87.   this.contentBox = new TextBox("内容"""70, TextField.ANY);  
  88.   contentBox.addCommand(cmdOk);  
  89.   contentBox.addCommand(cmdBack);  
  90.   contentBox.setCommandListener(this);  
  91.   m_textBoxs[0] = mobileBox;  
  92.   m_textBoxs[1] = contentBox;  
  93.   // /custom..  
  94.   this.menuBar = new MenuBar();  
  95.   this.header = new Header("发送短信");  
  96.   this.label = new Component("后退");  
  97.   label.setKeyListener(new IKeyListener() {  
  98.    public void actionPerformed(Object obj, KEvent e) {  
  99.     parent.setHome();  
  100.    }  
  101.   });  
  102.   this.mainMenu = new Menu("菜单");  
  103.   this.itemSend = new MenuItem("发送");  
  104.   this.itemContent = new MenuItem("内容");  
  105.   mainMenu.addItem(itemSend);  
  106.   mainMenu.addSeparator();  
  107.   mainMenu.addItem(itemContent);  
  108.   mainMenu.setItemListener(this);  
  109.   this.menuBar.setHeight(30);  
  110.   this.menuBar.setLabel(label);  
  111.   this.menuBar.setMenu(mainMenu);  
  112.   setHeader(header);  
  113.   setMenuBar(menuBar);  
  114.   setKeyPressedListener(this);  
  115.   setBackground(0xFFFFFF);  
  116.   // /custom  
  117.  }  
  118.   
  119.  protected void drawWorkspace(Graphics g) {  
  120.   Font font = Constants.PLAIN_MEDIUM_FONT;  
  121.   g.setFont(font);  
  122.   g.setColor(0);  
  123.   String str = "手机号码";  
  124.   int offx = 5;  
  125.   int x = offx;  
  126.   int fh = font.getHeight();  
  127.   g.drawString(str, 55 + (30 - fh) / 2, Graphics.LEFT | Graphics.TOP);  
  128.   if (currentField == 0)  
  129.    g.setColor(0x336699);  
  130.   else  
  131.    g.setColor(0xCCCCCC);  
  132.   x = offx + font.stringWidth(str) + 2;  
  133.   g.fillRect(x, 5, workspaceWidth - x - offx, 30);  
  134.   g.setColor(0xFFFFFF);  
  135.   g.fillRect(x + 25 + 2, workspaceWidth - x - offx - 430 - 4);  
  136.   char[] ch_str;  
  137.   int p_str_w = 0;  
  138.   int p_str_index = 0;  
  139.   if (m_strValues[0] != null) {  
  140.    g.setColor(0);  
  141.    ch_str = m_strValues[0].toCharArray();  
  142.    for (; p_str_index < ch_str.length; p_str_index++) {  
  143.     p_str_w += font.charWidth(ch_str[p_str_index]);  
  144.     if (p_str_w >= (workspaceWidth - x - offx - 4))  
  145.      break;  
  146.    }  
  147.    g.drawChars(ch_str, 0, p_str_index, x + 25 + 2, Graphics.LEFT  
  148.      | Graphics.TOP);  
  149.   }  
  150.   str = "短信内容";  
  151.   g.setColor(0);  
  152.   g.drawString(str, offx, 40, Graphics.LEFT | Graphics.TOP);  
  153.   if (currentField == 1)  
  154.    g.setColor(0x336699);  
  155.   else  
  156.    g.setColor(0xCCCCCC);  
  157.   g.fillRect(offx, 40 + fh + 5, workspaceWidth - 10, workspaceHeight - 45  
  158.     - 2 - fh);  
  159.   g.setColor(0xFFFFFF);  
  160.   g.fillRect(offx + 240 + fh + 5 + 2, workspaceWidth - 10 - 4,  
  161.     workspaceHeight - 45 - 2 - 4 - fh);  
  162.   int c_w = font.charWidth('中');  
  163.   if (m_strValues[1] != null) {  
  164.    g.setColor(0);  
  165.    // 要计算一行显示几个字,到哪个字的时候回行  
  166.    ch_str = m_strValues[1].toCharArray();  
  167.    p_str_w = p_str_index = 0;  
  168.    int p_line = 0;  
  169.    x = 0;  
  170.    int y = 0;  
  171.    for (; p_str_index < ch_str.length; p_str_index++) {  
  172.     if (p_str_w >= (workspaceWidth - 10 - 4 - c_w)) {  
  173.      p_line++;  
  174.      p_str_w = 0;  
  175.     }  
  176.   
  177.     x = offx + 2 + p_str_w;  
  178.     y = 40 + fh + 5 + 2 + p_line * fh;  
  179.     // 没有实现滚动条啊  
  180.     if (y >= workspaceHeight - 45 - 2 - 4 - fh)  
  181.      break;  
  182.     g.drawChar(ch_str[p_str_index], x, y, Graphics.LEFT  
  183.       | Graphics.TOP);  
  184.     p_str_w += font.charWidth(ch_str[p_str_index]);  
  185.    }  
  186.   }  
  187.  }  
  188.   
  189.  public void actionPerformed(Object obj, KEvent e) {  
  190.   switch (e.gameAction) {  
  191.   case UP:  
  192.    currentField--;  
  193.    if (currentField < 0)  
  194.     currentField = 0;  
  195.    repaint();  
  196.    break;  
  197.   case DOWN:  
  198.    currentField++;  
  199.    if (currentField > 1)  
  200.     currentField = 1;  
  201.    repaint();  
  202.    break;  
  203.   default:  
  204.    if (e.keyCode == CENTER_OK_KEY) {  
  205.     parent.display.setCurrent(m_textBoxs[currentField]);  
  206.    }  
  207.    break;  
  208.   
  209.   }  
  210.  }  
  211.   
  212.  public void commandAction(Command c, Displayable d) {  
  213.   if (c == cmdOk) {  
  214.    this.m_strValues[currentField] = m_textBoxs[currentField]  
  215.      .getString();  
  216.    parent.display.setCurrent(this);  
  217.   } else  
  218.    parent.display.setCurrent(d);  
  219.   
  220.  }  
  221.   
  222.  private Alert alert = new Alert("信息"""null, AlertType.INFO);  
  223.   
  224.  private void sendSms() {  
  225.   if (m_strValues == null || m_strValues[0] == null  
  226.     || m_strValues[0].trim().length() != 11) {  
  227.    alert.setType(AlertType.ERROR);  
  228.    alert.setString("没有写信人号码啊");  
  229.    parent.display.setCurrent(alert);  
  230.   }  
  231.   Thread thread = new Thread(new Runnable() {  
  232.   
  233.    public void run() {  
  234.   
  235.     String address = "sms://" + m_strValues[0];  
  236.     MessageConnection mesconn = null;  
  237.     try {  
  238.      mesconn = (MessageConnection) Connector.open(address);  
  239.   
  240.      TextMessage textmessage = (TextMessage) mesconn  
  241.        .newMessage(MessageConnection.TEXT_MESSAGE);  
  242.      textmessage.setAddress(address);  
  243.      textmessage.setPayloadText(m_strValues[1]);  
  244.      mesconn.send(textmessage);  
  245.      alert.setType(AlertType.INFO);  
  246.      alert.setString("发送成功");  
  247.     } catch (Throwable t) {  
  248.      t.printStackTrace();  
  249.      alert.setType(AlertType.ERROR);  
  250.      alert.setString("发送失败");  
  251.     } finally {  
  252.      try {  
  253.       mesconn.close();  
  254.      } catch (Exception ioe) {  
  255.      }  
  256.     }  
  257.     parent.display.setCurrent(alert);  
  258.    }  
  259.   });  
  260.   
  261.   thread.start();  
  262.   
  263.  }  
  264.   
  265.  public void actionPerformed(MenuItemEvent e) {  
  266.   if (e.item == this.itemContent) {  
  267.    this.currentField = 1;  
  268.    parent.display.setCurrent(contentBox);  
  269.   } else {  
  270.    sendSms();  
  271.   }  
  272.   
  273.  }  
  274.   
  275. }  

原文地址:http://www.zhanglihai.com/blog/c_412.html
   
最后更新时间:2007-09-20
哈哈,兄弟,我实现了一个输入法的功能,在我的UI组件里面
   
0 请登录后投票
最后更新时间:2007-09-20
呵呵,怎么实现的.用字库吗?
   
0 请登录后投票
最后更新时间:2007-09-24
是的。当然要用到字库了
   
0 请登录后投票
最后更新时间:2008-07-31
谢谢 搂主的代码我也模仿做了一个例子
   
0 请登录后投票
论坛首页 Java版 J2ME

跳转论坛:
JavaEye推荐