J2ME自己画输入框界面
2007-9-8 11:58:27
看了几个小时的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的扩展的。
import javax.microedition.io.Connector; import javax.microedition.lcdui.Alert; import javax.microedition.lcdui.AlertType; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.TextBox; import javax.microedition.lcdui.TextField; import javax.wireless.messaging.MessageConnection; import javax.wireless.messaging.TextMessage;import com.zhanglihai.j2me.event.IKeyListener; import com.zhanglihai.j2me.event.IMenuItemListener; import com.zhanglihai.j2me.ui.Component; import com.zhanglihai.j2me.ui.Constants; import com.zhanglihai.j2me.ui.FormCanvas; import com.zhanglihai.j2me.ui.Header; import com.zhanglihai.j2me.ui.KEvent; import com.zhanglihai.j2me.ui.Menu; import com.zhanglihai.j2me.ui.MenuBar; import com.zhanglihai.j2me.ui.MenuItem; import com.zhanglihai.j2me.ui.MenuItemEvent; /** * <P> * Title: * </P> * <P> * Description: * </P> * <P> * Copyright: Copyright(c) 2007 * </P> * <P> * Company * </P> * * @project : j2me-framework * @author : zhanglihai * @home : http://www.zhanglihai.com * @email : zhanglihai.com@gmail.com * @date : 2007-9-7 * @file : SmsSendForm.java * @version : 1.0 * * $Id: SmsSendForm.java,v 1.0 2007/07/07 14:51:11 zhanglihai Exp $ */ public class SmsSendForm extends FormCanvas implements CommandListener, IKeyListener, IMenuItemListener { private TestJ2MEFramework parent; private TextBox mobileBox; private Command cmdOk = new Command("完成", Command.OK, 1); private Command cmdBack = new Command("后退", Command.BACK, 1); private MenuBar menuBar = null; private Header header = null; private Component label = null; private Menu mainMenu; private MenuItem itemSend; private MenuItem itemContent; private int currentField = -1; private TextBox contentBox = null; private String[] m_strValues = new String[2];; private TextBox[] m_textBoxs = new TextBox[2]; public SmsSendForm(final TestJ2MEFramework parent) { this.parent = parent; this.mobileBox = new TextBox("手机号码", "", 11, TextField.PHONENUMBER); this.mobileBox.addCommand(cmdOk); this.mobileBox.addCommand(cmdBack); mobileBox.setCommandListener(this); this.contentBox = new TextBox("内容", "", 70, TextField.ANY); contentBox.addCommand(cmdOk); contentBox.addCommand(cmdBack); contentBox.setCommandListener(this); m_textBoxs[0] = mobileBox; m_textBoxs[1] = contentBox; // /custom.. this.menuBar = new MenuBar(); this.header = new Header("发送短信"); this.label = new Component("后退"); label.setKeyListener(new IKeyListener() { public void actionPerformed(Object obj, KEvent e) { parent.setHome(); } }); this.mainMenu = new Menu("菜单"); this.itemSend = new MenuItem("发送"); this.itemContent = new MenuItem("内容"); mainMenu.addItem(itemSend); mainMenu.addSeparator(); mainMenu.addItem(itemContent); mainMenu.setItemListener(this); this.menuBar.setHeight(30); this.menuBar.setLabel(label); this.menuBar.setMenu(mainMenu); setHeader(header); setMenuBar(menuBar); setKeyPressedListener(this); setBackground(0xFFFFFF); // /custom } protected void drawWorkspace(Graphics g) { Font font = Constants.PLAIN_MEDIUM_FONT; g.setFont(font); g.setColor(0); String str = "手机号码"; int offx = 5; int x = offx; int fh = font.getHeight(); g.drawString(str, 5, 5 + (30 - fh) / 2, Graphics.LEFT | Graphics.TOP); if (currentField == 0) g.setColor(0x336699); else g.setColor(0xCCCCCC); x = offx + font.stringWidth(str) + 2; g.fillRect(x, 5, workspaceWidth - x - offx, 30); g.setColor(0xFFFFFF); g.fillRect(x + 2, 5 + 2, workspaceWidth - x - offx - 4, 30 - 4); char[] ch_str; int p_str_w = 0; int p_str_index = 0; if (m_strValues[0] != null) { g.setColor(0); ch_str = m_strValues[0].toCharArray(); for (; p_str_index < ch_str.length; p_str_index++) { p_str_w += font.charWidth(ch_str[p_str_index]); if (p_str_w >= (workspaceWidth - x - offx - 4)) break; } g.drawChars(ch_str, 0, p_str_index, x + 2, 5 + 2, Graphics.LEFT | Graphics.TOP); } str = "短信内容"; g.setColor(0); g.drawString(str, offx, 40, Graphics.LEFT | Graphics.TOP); if (currentField == 1) g.setColor(0x336699); else g.setColor(0xCCCCCC); g.fillRect(offx, 40 + fh + 5, workspaceWidth - 10, workspaceHeight - 45 - 2 - fh); g.setColor(0xFFFFFF); g.fillRect(offx + 2, 40 + fh + 5 + 2, workspaceWidth - 10 - 4, workspaceHeight - 45 - 2 - 4 - fh); int c_w = font.charWidth('中'); if (m_strValues[1] != null) { g.setColor(0); // 要计算一行显示几个字,到哪个字的时候回行 ch_str = m_strValues[1].toCharArray(); p_str_w = p_str_index = 0; int p_line = 0; x = 0; int y = 0; for (; p_str_index < ch_str.length; p_str_index++) { if (p_str_w >= (workspaceWidth - 10 - 4 - c_w)) { p_line++; p_str_w = 0; } x = offx + 2 + p_str_w; y = 40 + fh + 5 + 2 + p_line * fh; // 没有实现滚动条啊 if (y >= workspaceHeight - 45 - 2 - 4 - fh) break; g.drawChar(ch_str[p_str_index], x, y, Graphics.LEFT | Graphics.TOP); p_str_w += font.charWidth(ch_str[p_str_index]); } } } public void actionPerformed(Object obj, KEvent e) { switch (e.gameAction) { case UP: currentField--; if (currentField < 0) currentField = 0; repaint(); break; case DOWN: currentField++; if (currentField > 1) currentField = 1; repaint(); break; default: if (e.keyCode == CENTER_OK_KEY) { parent.display.setCurrent(m_textBoxs[currentField]); } break; } } public void commandAction(Command c, Displayable d) { if (c == cmdOk) { this.m_strValues[currentField] = m_textBoxs[currentField] .getString(); parent.display.setCurrent(this); } else parent.display.setCurrent(d); } private Alert alert = new Alert("信息", "", null, AlertType.INFO); private void sendSms() { if (m_strValues == null || m_strValues[0] == null || m_strValues[0].trim().length() != 11) { alert.setType(AlertType.ERROR); alert.setString("没有写信人号码啊"); parent.display.setCurrent(alert); } Thread thread = new Thread(new Runnable() { public void run() { String address = "sms://" + m_strValues[0]; MessageConnection mesconn = null; try { mesconn = (MessageConnection) Connector.open(address); TextMessage textmessage = (TextMessage) mesconn .newMessage(MessageConnection.TEXT_MESSAGE); textmessage.setAddress(address); textmessage.setPayloadText(m_strValues[1]); mesconn.send(textmessage); alert.setType(AlertType.INFO); alert.setString("发送成功"); } catch (Throwable t) { t.printStackTrace(); alert.setType(AlertType.ERROR); alert.setString("发送失败"); } finally { try { mesconn.close(); } catch (Exception ioe) { } } parent.display.setCurrent(alert); } }); thread.start(); } public void actionPerformed(MenuItemEvent e) { if (e.item == this.itemContent) { this.currentField = 1; parent.display.setCurrent(contentBox); } else { sendSms(); } } }
|