⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 loginform.java

📁 一个手机上的IM 即时通信工具完整代码 J2ME项目
💻 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 + -