J2ME自己画输入框界面

前言:

之前写的功能中没有实现触摸屏,今天完成了触摸屏的一些操作。

其实只要实现pointerPressed(int x,int y); pointerReleased(int x,int y);然后根据当前的x,y计算出当前是哪个控件获得焦点,Pressed的意思是操作笔点下去出发的事件,当操作笔离开的时候出发Released事件。

控制好以上两个函数,计算出x,y然后获得当前活跃的对象,就可以了。实现起来比key事件稍微麻烦一些。
打开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;
 
/**
*
* @project : j2me-framework
* @author : zhanglihai
* @home : <a href="http://www.zhanglihai.com/">http://www.zhanglihai.com</a>
* @email : <a href="mailto:[email protected]">[email protected]</a>
* @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 &lt; ch_str.length; p_str_index++) {
p_str_w += font.charWidth(ch_str[p_str_index]);
if (p_str_w &gt;= (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 &lt; ch_str.length; p_str_index++) {
if (p_str_w &gt;= (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 &gt;= 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 &lt; 0)
currentField = 0;
repaint();
break;
case DOWN:
currentField++;
if (currentField &gt; 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();
}
 
}
 
}
分享到: 更多