在去食堂的路上想到的一个点子,觉得很有意思就写了出来。要学会在代码中找乐趣嘛,很有意思的一个小程序。
由于是用Java实现的所以图形显示界面是通过java的GUI实现的。
首先先来介绍一下我们的最终成果。写了四个类文件分别是Constant.java(用于存放数据)、Account.java(一个简单的账户类)、Login.java(用来实现登录界面和功能)和Register.java(用来实现注册界面和功能),其中Register和Login才是重点。熟悉QQ的同学都知道我们打开主程序都是显示登录界面,然后在登录界面可跳转到注册界面,但我们必须先注册了才能登录,所以我们先来实现注册界面,在实现注册界面之前先简单介绍一下Constant类和Account类。
一、Constant.java和Account.java
Account类一个简单的账户类,一共有ID、username、password三个属性。
public class Account {
private int ID;
private String username;
private String password;
public Account() {
}
public Account(int iD, String password) {
super();
ID = iD;
this.password = password;
}
public Account(int iD, String username, String password) {
super();
ID = iD;
this.username = username;
this.password = password;
}
public int getID() {
return ID;
}
public void setID(int iD) {
ID = iD;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Constant类存放了两个map数据,mapPass用来存放账号和密码,mapUser用来存放账号和用户名。
附上代码:
import java.util.HashMap;
public class Constant {
public static HashMap<Integer, String> mapPass = new HashMap<>();
public static HashMap<Integer, String> mapUser = new HashMap<>();
}
二、Register.java
首先先来展示一下Register的最终界面:
两个JLabel标签用于显示文字,两个JTextField的文本输入框用来输入用户名和密码,最下面个按钮实现注册功能,由于是用javaGUI实现的所以界面比较简陋,不过不要在意这不是重点。整个界面的实现的就是GUI的布局没什么好说的。下面说下注册功能的核心思想:
我们都知道QQ的注册是不能自己填写QQ号码的,是由系统随机分配的,所以我们这也由系统随机分配号码,主要使用到了Math.random()方法实现这个功能。代码如下:
int ID = (int) (90000 * Math.random() + 10000);
这行代码是随机生成一个五位数的整形数据,可以用来当做我们的账号号码。那么怎么关联我们的账号和用户名以及密码呢?这就用到了我们Constant类中的两个map,我们可以用两个map来关联三个属性。
我们需要为按钮注册一个ActionListener来监听用户事件,由于我们只使用这一次,所以可以用匿名内部类来实现,在用户点击确定按钮时,我们可以用JTextField提供的getText()方法来获得用户输入的数据,再将系统自动生成的账户ID和用户输入的数据一块存入我们创建的Account实例中。这样就实现了用户的注册。
代码中,我创建了一个creatAccount()方法,来实现以上功能,在事件发生后调用creatAccount方法,即实现了用户的注册,在方法最后把创建的账户的ID、username、password放入我们Constant类的map中储存起来,留待之后使用。
最后通过JOptionPane弹出一个提示框,告诉用户注册成功以及注册得到的ID。
附上全部代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Register extends JFrame {
private JTextField user_f, pass_f;
private JPanel p1,p2;
private Container c;
private JLabel user_l, pass_l;
private JButton ok;
public Register() {
super("注册");
c = getContentPane();
p1=new JPanel();
p2=new JPanel();
p1.setLayout(new GridLayout(2,2));
user_l = new JLabel("请输入用户名");
user_f = new JTextField();
p1.add(user_l);
p1.add(user_f);
pass_l = new JLabel("请输入密码");
pass_f = new JTextField();
p1.add(pass_l);
p1.add(pass_f);
ok = new JButton("确定");
ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
creatAccount();
JOptionPane.showMessageDialog(c, "注册成功,您的账号为" + Constant.a.getID());
}
});
p2.add(ok);
c.add(p1, BorderLayout.CENTER);
c.add(p2, BorderLayout.SOUTH);
setSize(250, 120);
setLocationRelativeTo(null);
setVisible(true);
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
}
public void creatAccount() {
int ID = (int) (90000 * Math.random() + 10000);
String username = user_f.getText();
String password = pass_f.getText();
Constant.a.setID(ID);
Constant.a.setPassword(password);
Constant.a.setUsername(username);
Constant.mapPass.put(ID, password);
Constant.mapUser.put(ID, username);
}
}
三、Login.java
首先先来展示一下Login的最终界面:
在这个界面我们可以输入账号ID和密码来登录,界面上的注册按钮可以转到注册界面,然后让用户注册后在登录。
登录的时候我们需要做几个异常检测,如,“账号不存在”,“账号密码不一致”。这需要在用户点击登录按钮时实现。
我们需要去到mapPass里面去找到用户所输入的ID,如果未找到则弹出“账号不存在”错误。如果账号存在,再检测账号与密码是否匹配,如果不匹配弹出“账号与密码不一致”错误。如果没有错误
这就用到了我们Constant类中用于存放数据的两个map。
详见代码:
public void actionPerformed(ActionEvent e) {
int tempId = Integer.parseInt(user.getText());
if (!Constant.mapPass.containsKey(tempId)) {
JOptionPane.showMessageDialog(c, "该账号尚未注册!", "错误", JOptionPane.ERROR_MESSAGE);
} else if (!Constant.mapPass.get(tempId).equals(pass.getText())) {
JOptionPane.showMessageDialog(c, "账号与密码不一致!", "错误", JOptionPane.ERROR_MESSAGE);
} else {
JOptionPane.showMessageDialog(c, "登录成功!");
}
}
<strong>最后附上Login的全部代码:</strong>
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Login extends JFrame {
private JTextField user, pass;
private JPanel u, p, b;
private Container c;
private JLabel ID, password;
private JButton login, register;
public Login() {
super("登录");
c = getContentPane();
u = new JPanel();
p = new JPanel();
b = new JPanel();
u.setLayout(new BorderLayout());
p.setLayout(new BorderLayout());
ID = new JLabel("账号");
user = new JTextField();
u.add(ID, BorderLayout.WEST);
u.add(user, BorderLayout.CENTER);
password = new JLabel("密码");
pass = new JTextField();
p.add(password, BorderLayout.WEST);
p.add(pass, BorderLayout.CENTER);
login = new JButton("登录");
login.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int tempId = Integer.parseInt(user.getText());
if (!Constant.mapPass.containsKey(tempId)) {
JOptionPane.showMessageDialog(c, "该账号尚未注册!", "错误", JOptionPane.ERROR_MESSAGE);
} else if (!Constant.mapPass.get(tempId).equals(pass.getText())) {
JOptionPane.showMessageDialog(c, "账号与密码不一致!", "错误", JOptionPane.ERROR_MESSAGE);
} else {
Client c = new Client();
}
}
});
register = new JButton("注册");
register.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Register r = new Register();
}
});
b.add(login);
b.add(register);
c.add(u, BorderLayout.NORTH);
c.add(p, BorderLayout.CENTER);
c.add(b, BorderLayout.SOUTH);
setSize(250, 120);
setLocationRelativeTo(null);
setVisible(true);
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
}
public static void main(String[] args) {
Login a = new Login();
}
}
看到好多要源码的,在此贴一下这个项目的github地址,感兴趣的可以自己去下载,可以运行无bug的:
https://github.com/wuud/myJavaProject
第一个chatRoom就是这个项目的升级版。是在注册登录的基础上又加了多线程聊天室功能。
如果大家只是想运行注册登录功能的话,项目下载解压后,会有个Login类,运行这个类就可以体验注册登录功能了。弹出登录面板后,再点击注册按钮就可以了。
如果大家想要运行聊天室项目的话,需要先启动服务类Server,再启动Login类,下面的步骤和上面一样。