📄 loginform.java
字号:
package myim.ui;
import myim.logic.*;
import myim.midlet.MyIMMIDlet;
import javax.microedition.lcdui.*;
/**
* 登录界面
*/
public class LoginForm extends Form implements CommandListener, HttpListener {
/**Display对象*/
private Display display;
/**登录按钮*/
private Command cmdLogin;
/**注册按钮*/
private Command cmdRegister;
/**退出按钮*/
private Command cmdExit;
/**用户名文本框*/
private TextField tfUsername;
/**密码文本框*/
private TextField tfPassword;
/**记住密码选择框*/
private ChoiceGroup cgRememberPwd;
/**信息提示框*/
private Alert alert;
/**用户标识id*/
private String id;
/**
* 默认构造方法
* @param display Display对象
*/
public LoginForm(Display display) {
super("登录");
this.display = display;
//初始化界面
initUI();
//注册事件监听器
setCommandListener(this);
}
/**
* 默认构造方法
* @param display Display对象
* @param userName 用户名
* @param pwd1 密码
*/
public LoginForm(Display display, String userName, String pwd1) {
this(display);
//初始化用户名和密码框
tfUsername.setString(userName);
tfPassword.setString(pwd1);
}
/**
* 初始化界面
*/
private void initUI() {
cmdLogin = new Command("登录", Command.OK, 1);
cmdRegister = new Command("注册", Command.SCREEN, 1);
cmdExit = new Command("退出", Command.EXIT, 1);
//添加到界面
addCommand(cmdLogin);
addCommand(cmdRegister);
addCommand(cmdExit);
tfUsername = new TextField("用户名:", "", 16, TextField.ANY);
tfPassword = new TextField("密码:", "", 16, TextField.PASSWORD);
cgRememberPwd = new ChoiceGroup("记住密码", ChoiceGroup.EXCLUSIVE);
cgRememberPwd.append("是", null);
cgRememberPwd.append("否", null);
//添加到界面
append(tfUsername);
append(tfPassword);
append(cgRememberPwd);
alert = new Alert("MyIM", "", null, AlertType.INFO);
}
/**
* 事件处理方法
* @param command Command 被按下的按钮
* @param displayable Displayable 发生事件的界面对象
*/
public void commandAction(Command command, Displayable displayable) {
//登录按钮
if (command == cmdLogin) {
//获得用户名输入
String name = tfUsername.getString().trim();
//获得密码输入
String password = tfPassword.getString().trim();
//获得是否记住密码选择
int select = cgRememberPwd.getSelectedIndex();
//记住密码处理
if (select == 0) {
RMSUtils.saveNameAndPassword(name, password);
}
//发送数据
if (name.length() == 0) { //用户名输入为空
//设置提示信息
alert.setString("用户名输入为空");
//显示提示
display.setCurrent(alert);
} else if (password.length() == 0) { //密码输入为空
//设置提示信息
alert.setString("密码输入为空");
//显示提示
display.setCurrent(alert);
} else {
//发送登录指令
sendLoginData(name, password);
}
}
//注册按钮
if (command == cmdRegister) {
//显示注册界面
display.setCurrent(new RegisterForm(display));
}
//退出按钮
if (command == cmdExit) {
//程序退出
MyIMMIDlet.quitApp();
}
}
/**
* 发送登录信息
* @param name String 用户名
* @param password String 密码
*/
private void sendLoginData(String name, String password) {
try {
//将姓名和密码转换为UTF-8格式的byte数组
byte[] nameData = name.getBytes("utf-8");
byte[] passwordData = password.getBytes("utf-8");
//构造指令数组
byte[] data = new byte[1 + 1 + nameData.length + 1 +
passwordData.length];
//初始化数据
data[0] = RequestInterface.LOGIN_SERVER;
data[1] = (byte) nameData.length;
System.arraycopy(nameData, 0, data, 2, nameData.length);
data[2 + nameData.length] = (byte) password.length();
System.arraycopy(passwordData, 0, data, 3 + nameData.length,
passwordData.length);
//发送数据
new HttpThread(this, data);
} catch (Exception e) {
System.out.println("sendLoginData:" + e);
}
}
/**
* 发送查询在线用户数据
* @param id String 用户标识id
* @return String[] 在线用户名数组
*/
private void sendQueryOnLineUser(String id) {
try {
//转换用户id
byte[] idData = id.getBytes("utf-8");
//构造协议数据
byte[] data = new byte[2 + idData.length];
data[0] = RequestInterface.QUERY_ONLINE_USERNAME;
data[1] = (byte) idData.length;
System.arraycopy(idData, 0, data, 2, idData.length);
//发送数据
new HttpThread(this, data);
} catch (Exception e) {
System.out.println("sendQueryOnLineUser:" + e);
}
}
/**
* 处理服务器反馈数据
* @param data byte[] 服务器反馈信息
*/
public void getResponse(byte[] data) {
try {
//解析服务器反馈
switch (data[0]) { //指令
case ResponseInterface.LOGIN_SUCCESS: //登录成功
//获得用户id
id = new String(data, 1, data.length - 1, "utf-8");
//读取在线用户
sendQueryOnLineUser(id);
break;
case ResponseInterface.LOGIN_NOT_REGISTER: //用户未注册
alert.setString("用户未注册");
//显示提示
display.setCurrent(alert, this);
break;
case ResponseInterface.LOGIN_PASSWORD_ERROR: //密码错误
alert.setString("密码错误");
//显示提示
display.setCurrent(alert, this);
break;
case ResponseInterface.LOGIN_SERVER_BUSY: //服务器忙
alert.setString("服务器忙");
//显示提示
display.setCurrent(alert, this);
break;
case ResponseInterface.LOGIN_SERVER_INFO: //服务器提示信息
String msg = new String(data, 1, data.length - 1, "utf-8");
alert.setString(msg);
//显示提示
display.setCurrent(alert, this);
break;
case ResponseInterface.LOGIN_VERSION_LOWER: //版本过低
alert.setString("版本过低");
//显示提示
display.setCurrent(alert, this);
break;
//查询在线用户反馈
case ResponseInterface.QUERY_ONLINE_USERNAME_SUCCESS: //查询在线用户列表信息
//获得在线用户列表
String[] userName = parseUserName(data);
//显示用户列表界面
display.setCurrent(new UserList(display, userName, id));
break;
case ResponseInterface.QUERY_ONLINE_USERNAME_FAILURE: //查询在线用户信息失败
doError("查询在线用户信息失败!");
break;
default: //其它
doError("无法解析的数据!");
break;
}
} catch (Exception e) {
doError(e.toString());
}
}
/**
* 从反馈数据中解析出在线用户列表
* 反馈字节数组格式如下:
* 1、第一个字节——反馈结果指令
* 2、第二个字节——在线用户数量
* 3、第三个字节——第一个用户名的长度n1
* 4、第四个字节到4+n1——第一个用户名称
* 重复3、4的结构
* @param data 服务器反馈数据
* @return String[] 在线用户名单
*/
private String[] parseUserName(byte[] data) {
//获得在线用户数量
String[] userName = new String[data[1]];
//用户名数据长度
int len = 0;
//用数组下标
int startIndex = 2;
//解析用户名列表
try {
for (int i = 0; i < userName.length; i++) {
//获得用户名数据长度
len = data[startIndex];
//构造用户名数据
userName[i] = new String(data, startIndex + 1, len, "utf-8");
//下一个用户数据的下标
startIndex += len + 1;
}
} catch (Exception e) {
doError("无法解析的数据!");
}
return userName;
}
/**
* 处理错误信息
* @param errMsg String 错误信息
*/
public void doError(String errMsg) {
alert.setString(errMsg);
//显示提示
display.setCurrent(alert, this);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -