Javax实现登录注册功能界面
实现目标:能够像正常的登录注册界面那样使用
实现基本窗体界面
这里有一些比较固定的界面设定,比如窗体的项目名称,窗体的大小,窗体的进程设置,窗体居屏幕的位置,组件是否可视化。
public class drawUI {
public void initUI() {
JFrame jFrame = new JFrame();
jFrame.setTitle("画板");
jFrame.setSize(900, 900);
jFrame.setLocationRelativeTo(null);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);//这个要加在所有添加组件后面,否则看不到所添加的组件
}
实现输入框和相关按钮
需要注意的是:输入框的大小这里不能直接用 setSize()
之类的方法,而是用到另一个方法。
而设置按钮是一种比较常规的 JButton jb = new JButton();
方法
还有要注意的是:除了窗体的设置大小的方法用的是setSize()
方法以外,其余的组件设置大小都是用到setPreferredSize(new Dimesion())
方法
/*这里是设置输入框的大小和布局的方法*/
//加载图片
ImageIcon image = new ImageIcon("D:/照片/1.jpg");
//标签 限制图片不能太大的 JLabel相当于一个容器
JLabel jla = new JLabel(image);
jla.setPreferredSize(new Dimension(500,100));
jFrame.add(jla);
JTextField jtf = new JTextField();//登录输入框
Dimension dm = new Dimension(300,500);
jtf.setPreferredSize(dm);
jFrame.add(jtf);
/*这里是设置按钮的方法,比较普遍*/
JButton jb = new JButton("登录");
jFrame.add(jb);
JButton jb1 = new JButton("注册");
jFrame.add(jb1);
在正常实现输入框和按钮之前,要想布局正常需要加一个流体布局
FlowLayout flowlayout = new FlowLayout();
jFrame.setLayout(flowlayout);
做到这一步的时候,此时在main方法中用类名调用方法可以实现一个窗体大致布局出来了。但是想要实现相应按钮的功能,需要给按钮添加监听器。
给事件源创建监听器
在添加监听器之前我们首先要了解三个概念:
事件源:当前动作所发生的组件(注意当前两个字)
监听器:动作监听器方法(addActionListener()
)
绑定事件处理类
当前我们就可以确定事件源为按钮(登录或者注册),要给事件源添加监听器,给按钮添加监听器的方法为Jbutton.addActionListener()
点开addActionListener()
查看源码(里面有对源码的解释)
public void addActionListener(ActionListener l) {
/*这里需要添加ActionListener这个类 是引用类型,
由于ActionListener是个接口,所以这个形参只能是实现了ActionListener接口的普通类对象*/
listenerList.add(ActionListener.class, l);
}
/*发现ActionListener是个接口,因为接口没有实例对象,需要创建个普通类去实现这个接口*/
public interface ActionListener extends EventListener {
public void actionPerformed(ActionEvent e);
}
所以创建个普通类来实现改接口来实现接口里面的方法。(这里只是展示部分代码,后面有具体的实现业务的逻辑代码)
public class ButtonsListener implements ActionListener{
/**
* 这个是注册界面的框
*/
public JTextField jtf;
/**
* 这个是登录界面的框
*/
public JTextField jTextField;
ArrayList<String> arrayList = new ArrayList<String>();
@Override
public void actionPerformed(ActionEvent e) {
//业务逻辑代码
}
}
但现在到了这步出现一个问题,你要登录或者注册账号,第一,如何将登录界面的输入框的内容传送给按钮的监听器进行响应;第二,如何来储存所注册的账号
要解决第一个问题,首先我们要知道第一这两个类是否有联系,第二如何将两个内容联系起来。首先这个要实现共享内容共享 需要用到引用传递 格式:对象1.属性1 = 对象2.属性2 或者 对象1.属性1 = 属性2
JTextField jtf = new JTextField();//登录输入框
ButtonsListener buttonslistener = new ButtonsListener();
buttonslistener.Jtextfield = jtf; // 要实现共享内容共享 需要用到引用传递 格式:对象1.属性1 = 对象2.属性2;对象1.属性1 = 属性2
接下来解决第二个问题,创建一个容器ArrayList<String>
来储存注册的账号 。
再接着解决了事件相应问题和属性共享问题之后,就到了具体的业务逻辑代码的实现
登录注册功能的逻辑实现
这里需要注意的是两个问题:第一是注册页面中的jbu.addActionListener(this);
方法,这里不能用ButtonsListener buttonlistener = new ButtonsListener(); 然后jbu.addActionListener(buttonlistener);
的方法(详细解释在代码注释里面);第二是在注册功能的逻辑代码中需要注意的细节问题,详细解释在代码里面
public class ButtonsListener implements ActionListener {
/**
* 这个是注册界面的框
*/
public JTextField jtf;
/**
* 这个是登录界面的框
*/
public JTextField jTextField;
ArrayList<String> arrayList = new ArrayList<String>();
@Override
public void actionPerformed(ActionEvent e) {
// 接受响应按钮的内容
String s = e.getActionCommand();
if ("登录".equals(s)) {
String text = jTextField.getText();
userLogin(text);
}
if ("注册".equals(s)) {
registerUI();
}
if ("确定".equals(s)) {
String text = jtf.getText();
userRegister(text);
}
}
/**
* 注册页面 需要重新创建一个新的页面
*/
public void registerUI() {
JFrame jFrame1 = new JFrame();
jFrame1.setSize(450, 550);
jFrame1.setTitle("注册页面");
jFrame1.setLocationRelativeTo(null);
//流式布局管理器
FlowLayout flow = new FlowLayout();
//设置窗体为流式布局
jFrame1.setLayout(flow);
//用户提示
JLabel user = new JLabel("账号:");
jFrame1.add(user);
//注册账号框(文本框)
jtf = new JTextField();
jtf.setPreferredSize(new Dimension(370,30));
jFrame1.add(jtf);
//按钮
JButton jbu = new JButton("确定");
jFrame1.add(jbu);
jFrame1.setVisible(true);
/**
* this 是代表当前类的对象 这里只能用this关键字来作为形参 不能用在自己的类上new ButtonsListener()来代替this
* 因为this代表的是原来的类的对象,如果你用了new ButtonsListener()的新创建对象的话原来的属性就用不到了
*/
jbu.addActionListener(this);
}
/**
* 登录功能
*/
public void userLogin(String s) {
/**
* 登录是否成功地响应页面
*/
JFrame jFrame = new JFrame();
jFrame.setSize(300, 400);
jFrame.setLocationRelativeTo(null);
jFrame.setVisible(true);
if (arrayList.size() != 0) {
for (int i = 0; i < arrayList.size(); i++) {
if (arrayList.get(i).equals(s)) {
JLabel jLabel = new JLabel("登录成功");
jFrame.add(jLabel);
break;
} else {
JLabel jLabel = new JLabel("账号不正确,请重新登录");
jFrame.add(jLabel);
}
}
} else {
System.out.println("账号不存在,请注册账号");
JLabel jLabel = new JLabel("账号不存在,请注册账号");
jFrame.add(jLabel);
}
}
/**
* 注册功能
*/
public void userRegister(String s) {
/**
* 注册是否成功地响应页面
*/
JFrame jFrame2 = new JFrame();
jFrame2.setSize(300, 400);
jFrame2.setLocationRelativeTo(null);
jFrame2.setVisible(true);
//list为0 注册账号
if (arrayList.size() != 0) {
for (int i = 0; i < arrayList.size(); i++) {
if (arrayList.get(i).equals(s)) {
JLabel jLabel = new JLabel("重复账号,请重新注册");
jFrame2.add(jLabel);
}
/**
* 有问题 没有检查数组的内容就转入 下面的那个语句不能用简单的else
* 因为用了简单的else的话,假如第一次没有找到注册的账号之后,就立马在else里表明注册成功
* 但其实ArrayList中是有这个注册账号的
*/
else if (i + 1 == arrayList.size()) {
//到了数组最后一个内容都没有对应的账号的时候
arrayList.add(s);
JLabel jLabel = new JLabel("注册成功");
jFrame2.add(jLabel);
break;
}
}
} else {
arrayList.add(s);
JLabel jLabel = new JLabel("注册成功");
jFrame2.add(jLabel);
}
}
}
效果示意图: