这一节呢是接着上次图形化编程一进行补充的。(哎,博主前段时间去备考6级和期末了,两者时间隔得有点长)
回到正题,上次把登录界面讲完了,这次讲监视器的运用和注册界面的主要内容。
配置监视器
上节课我们创建的登录界面中有登录和注册两个按钮,但是这两个点击这两个按钮时没有反应,因此我们就要创建监视器来监听这两个按钮。
我们在创建监视器时,我们首先需要在最初的登录界面的代码下面写上每个按钮调用监视器方法。内容如下:
loginButton.addActionListener(mi);
registerButton.addActionListener(mi);
以上这段代码是调用监视器的具体方法。
格式如下:
被调用的按钮.addActionListener(ActionListener l)
而括号里面(ActionListener l)的就是这个方法的形参,由此我们可以看出这个形参是ActionListener 类的,但非常重要的的一点是这个ActionListener 他实际上是一个接口
详情如下:
public interface ActionListener extends EventListener {
public void actionPerformed(ActionEvent e);
}
而我们之前的文章讲过,接口不能直接创建对象,要想调用接口,则我们必须先创建一个实现类来实现接口(或者进行匿名内部类的重写)。
下面是实现类:
public class Monitor implements ActionListener {
public void actionPerformed(ActionEvent e){ //方法重写
}
然后我们需要再登录界面的代码中添加以下代码
Monitor mi=new Monitor();
mi.loginAccount=jtf;//登录账户
mi.loginPassword=jtf1;//登录密码
loginButton.addActionListener(mi);
registerButton.addActionListener(mi);
mi.loginAccount=jtf;
mi.loginPassword=jtf1; 这两段代码是用来把在登录界面输入的账号和密码传递到后台,判断是否由此账号和密码。(后面还会讲)
loginButton.addActionListener(mi);
registerButton.addActionListener(mi);而这两个是对两个按钮配置监视器
监视器的实现类
然后就是就开始进入到我们的监视器的实现类里面了
public void actionPerformed(ActionEvent e){
String condition=e.getActionCommand(); //保存被按按钮的名称
switch (condition){ //用来判断执行哪个按钮的功能
case "登录":
//String user= loginAccount.getText();
if(ifExists(users)){ //判断账号密码是否正确
login();
}else{
System.out.println("登录失败");
}
break;
case "注册":
register();
break;
case "确认":
compare();
break;
}
}
public void actionPerformed(ActionEvent e){
}
这个方法是当我们每按一次按钮时,他都会先执行一次这个方法,用来判断哪个按钮被按,从而执行相应的方法。
“登录“”按钮的方法(成功登录时)
public void login(){
JFrame loginJf=new JFrame();//创建一个登录成功的页面
loginJf.setSize(450,550);
loginJf.setTitle("登录页面");
loginJf.setLocationRelativeTo(null);
loginJf.setDefaultCloseOperation(2); //取消这个窗口时,程序不会全部关闭,只关闭当前窗口
FlowLayout fl=new FlowLayout();
loginJf.setLayout(fl);
//设置提示信息
JLabel user= new JLabel("登录成功");
loginJf.add(user);
loginJf.setVisible(true);
}
如果登录成功,则显示一个新的页面
结果如下:

注册按钮的方法
public void register (){
registerJf=new JFrame();
registerJf.setSize(450,350);
registerJf.setTitle("注册页面");
registerJf.setLocationRelativeTo(null);
registerJf.setDefaultCloseOperation(2);
FlowLayout registerFl=new FlowLayout();
registerJf.setLayout(registerFl);
JLabel newUser=new JLabel("注册新账号");
registerJf.add(newUser);
JTextField newJtf=new JTextField();
Dimension newDm=new Dimension(400,30);
newJtf.setPreferredSize(newDm);
registerAccount=newJtf;
registerJf.add(newJtf);
JLabel password=new JLabel("新密码");
registerJf.add(password);
JTextField newJtf2=new JTextField();
Dimension newDm2=new Dimension(400,30);
newJtf2.setPreferredSize(newDm2);
registerJf.add(newJtf2);
JLabel ensurePassword=new JLabel("确认密码");
registerJf.add(ensurePassword);
JTextField newJtf3=new JTextField();
Dimension newDm3=new Dimension(400,30);
newJtf3.setPreferredSize(newDm3);
registerJf.add(newJtf3);
JButton btn=new JButton("确认"); //创建确认按钮
registerJf.add(btn);
btn.addActionListener(this); //实参为本对象
setPassword=newJtf2;
enPassword=newJtf3;
registerAccount=newJtf;
registerJf.setVisible(true);
}
在这个代码中值得注意的是 btn.addActionListener(this);
这句代码的实参为本身的对象,因为它本身的对象就是Monitor类的
结果如下:

判断账号是否注册成功
public void compare(){
if((setPassword.getText()).equals(enPassword.getText())){ //判断密码是否与确认密码中的一致
registerPassword=setPassword;
User user=new User(); //保存账号和密码
user.setAccount(registerAccount.getText());
user.setPassword(registerPassword.getText());
users.add(user);
System.out.println("账号创建成功!");
}else{
System.out.println("两次密码不一致,请重新设置密码!");
}
registerJf.setVisible(false);//注册页面隐藏
}
这个代码中的**registerAccount.getText()**是把JTextField类转换成String类型的
而 User user=new User(); 是用来保存注册成功的账号和密码的
用户类
用户类是用来保存成功注册的账号和密码的。博主是单独创建了一个用户类然后用
**ArrayList users =new ArrayList<>();**进行多用户账户的保存的
ublic class User {
String account;
String password;
public void setAccount(String account) {
this.account = account;
}
public String getAccount(){
return account;
}
public void setPassword(String password){
this.password=password;
}
public String getPassword() {
return password;
}
}
判断是否有此账号
这个是用来判断登录界面的账户是否已经在系统中创建过的,若有则登录成功,
若无则失败。
代码如下:
public boolean ifExists(ArrayList<User> a){
for(int i=0;i<a.size();i++){ //检验系统中是否有此账户
if(loginAccount.getText().equals((a.get(i).getAccount()))&&(loginPassword.getText().equals(a.get(i).getPassword()))){
return true;
}
}
return false;
}
下面是监视器实现类的完整内容:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
//监视器的实现类(主要)
public class Monitor implements ActionListener {
ArrayList <User> users=new ArrayList<>() ;
public JTextField loginAccount; //记录登录界面输入的账号
public JTextField registerAccount; //记录登录界面输入的密码
public JTextField loginPassword; //记录注册界面注册的账号
public JTextField registerPassword; //确定注册界面输入的密码
public JTextField setPassword; //记录注册界面时设置的新密码
public JTextField enPassword; //记录注册时的确认密码
JFrame registerJf ; //注册界面的窗口
public void actionPerformed(ActionEvent e){
String condition=e.getActionCommand();
switch (condition){ //用来判断执行哪个按钮的功能
case "登录":
//String user= loginAccount.getText();
if(ifExists(users)){
login();
}else{
System.out.println("登录失败");
}
break;
case "注册":
register();
break;
case "确认":
compare();
break;
}
}
//显示新的登录页面
public void login(){
JFrame loginJf=new JFrame();
loginJf.setSize(450,550);
loginJf.setTitle("登录页面");
loginJf.setLocationRelativeTo(null);
loginJf.setDefaultCloseOperation(2);
FlowLayout fl=new FlowLayout();
loginJf.setLayout(fl);
//设置提示信息
JLabel user= new JLabel("登录成功");
loginJf.add(user);
loginJf.setVisible(true);
}
//显示注册页面
public void register (){
registerJf=new JFrame();
registerJf.setSize(450,350);
registerJf.setTitle("注册页面");
registerJf.setLocationRelativeTo(null);
registerJf.setDefaultCloseOperation(2);
FlowLayout registerFl=new FlowLayout();
registerJf.setLayout(registerFl);
JLabel newUser=new JLabel("注册新账号");
registerJf.add(newUser);
JTextField newJtf=new JTextField();
Dimension newDm=new Dimension(400,30);
newJtf.setPreferredSize(newDm);
registerAccount=newJtf;
registerJf.add(newJtf);
JLabel password=new JLabel("新密码");
registerJf.add(password);
JTextField newJtf2=new JTextField();
Dimension newDm2=new Dimension(400,30);
newJtf2.setPreferredSize(newDm2);
registerJf.add(newJtf2);
JLabel ensurePassword=new JLabel("确认密码");
registerJf.add(ensurePassword);
JTextField newJtf3=new JTextField();
Dimension newDm3=new Dimension(400,30);
newJtf3.setPreferredSize(newDm3);
registerJf.add(newJtf3);
JButton btn=new JButton("确认"); //创建确认按钮
registerJf.add(btn);
btn.addActionListener(this);
setPassword=newJtf2;
enPassword=newJtf3;
registerAccount=newJtf;
registerJf.setVisible(true);
}
//判断账号,密码是否注册成功
public void compare(){
if((setPassword.getText()).equals(enPassword.getText())){
// registerAccount=newJtf;
registerPassword=setPassword;
User user=new User();
user.setAccount(registerAccount.getText());
user.setPassword(registerPassword.getText());
users.add(user);
System.out.println("账号创建成功!");
}else{
System.out.println("两次密码不一致,请重新设置密码!");
}
registerJf.setVisible(false);
}
//判断是否有此账号
public boolean ifExists(ArrayList<User> a){
for(int i=0;i<a.size();i++){
if(loginAccount.getText().equals((a.get(i).getAccount()))&&(loginPassword.getText().equals(a.get(i).getPassword()))){
return true;
}
}
return false;
}
}
//用户类
public class User {
String account;
String password;
public void setAccount(String account) {
this.account = account;
}
public String getAccount(){
return account;
}
public void setPassword(String password){
this.password=password;
}
public String getPassword() {
return password;
}
}

被折叠的 条评论
为什么被折叠?



