JAVA学习之路-简单的登录界面

JAVA学习之路-简单的登录界面

在初学了JAVA的swing的图形界面后,自己按照书上的例子开始是做的一个简单的登录界面,然后自己想到可以介入数据库,于是就加了个数据库。做了后突然又发现可以做个注册界面,然后又想到才学的卡片式布局,就按照这个做个个登录界面的小程序。

程序通过把需要处理的用户名和密码传入到数据库连接函数里,然后进行判定,再通过返回不同的字符串在另外的函数里进行界面提示。

本程序的功能包括用户登录,和用户注册。
同时也兼具最基础的防止用户重复注册,检测密码不相同的功能。

这个程序由于是即兴做的,有很多BUG,代码也不简洁,有很多重复的代码,而且很多命名有比较类似,很容易模糊,做的时候就经常搞错名字导致出BUG。

对于算法这一块,也不是很熟悉,只是想到做出来就行了,自己对于接口这一方面也不是很熟悉,所以这个程序还是有很多需要改进的地方。后面有时间我会再把这个代码优化一下,如果有各位大佬有什么建议,请提出来,先提前感谢各位大佬。

import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class PassWord extends JFrame implements ActionListener {
    //初始化主面板
    private JPanel jp=new JPanel();
    //初始化登录面板
    private JPanel jp_1=new JPanel();
    //初始化注册面板
    private JPanel jp_2=new JPanel();

    /*          登录界面                    */
    //登录界面标签
    private JLabel[] jlArray=new JLabel[]{
            new JLabel("用户名"),new JLabel("密    码"),new JLabel(""),new JLabel("若无账号,请注册...")
    };
    //登录界面按钮
    private JButton[] jbArray=new JButton[]{
            new JButton("登录"),new JButton("清空"),new JButton("注册")
    };
    //登录界面文字框
    private JTextField jtxtName=new JTextField("");
    private JPasswordField jtxtPassword=new JPasswordField("");

    /*         注册界面                  */
    //注册界面标签
    private JLabel[] jlArray_2=new JLabel[]{
            new JLabel("用 户 名"),new JLabel("密      码"),new JLabel("确认密码"),new JLabel("22222")
    };
    //注册界面按钮
    private JButton[] jbArray_2=new JButton[]{
            new JButton("注册"),new JButton("清空"),new JButton("返回")
    };
    //注册界面文字框
    private JTextField jtxtName_2=new JTextField("");
    private JPasswordField jtxtPassword_2_1=new JPasswordField("");
    private JPasswordField jtxtPassword_2_2=new JPasswordField("");
    //建立数据库连接
    private Connection con=null;

    //构造函数,主程序
    public PassWord(){
        conDatabase();
        //窗口布局为null
        this.setLayout(null);                               
        //注册为卡片布局
        jp.setLayout(new CardLayout());                     
        //设置容器大小
        jp.setBounds(10,10,370,250);                        
        //创建登录界面
        jp_1=signIn(jp_1);                                  
        //创建注册界面
        jp_2=register(jp_2);                                
        //把各种界面加入卡片布局
        jp.add(jp_1,"sign");                                
        jp.add(jp_2,"register");                    
        //把最外层容器加入布局
        this.add(jp);                                       

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setBounds(100, 100, 400, 275);
        this.setTitle("登录");
        this.setVisible(true);
    }

    public JPanel signIn(JPanel jp_1){
        //登录界面默认布局
        jp_1.setLayout(null);                               
        //设置按钮,并监听
        for(int i=0;i<2;i++){                               
            jlArray[i].setBounds(55, 30+i*50, 90, 26);
            jbArray[i].setBounds(85+i*130, 150, 90, 26);
            jp_1.add(jlArray[i]);
            jp_1.add(jbArray[i]);
            jbArray[i].addActionListener(this);
        }
        //对姓名进行监听
        jtxtName.setBounds(135, 30, 180, 30);               
        jp_1.add(jtxtName);
        jtxtName.addActionListener(this);

        //对密码进行监听
        jtxtPassword.setBounds(135, 80, 180, 30);
        jp_1.add(jtxtPassword);
        jtxtPassword.addActionListener(this);

        //初始化登录提示
        jlArray[2].setBounds(10, 180, 300, 30);
        jp_1.add(jlArray[2]);

        //初始化注册提示
        jlArray[3].setBounds(170, 195, 300, 30);
        jp_1.add(jlArray[3]);

        //初始化注册按钮,并监听
        jbArray[2].setBounds(300, 195, 60, 30);
        jp_1.add(jbArray[2]);
        jbArray[2].addActionListener(this);
        //返回登录界面
        return jp_1;
    }

    public JPanel register(JPanel jp_2){
        //注册界面为默认布局
        jp_2.setLayout(null);
        //初始化用户名等标签
        for(int i=0;i<3;i++){
            jlArray_2[i].setBounds(55, 20+i*40, 90, 26);
            jp_2.add(jlArray_2[i]);
        }
        //初始化按钮
        for(int i=0;i<2;i++){
            jbArray_2[i].setBounds(85+i*130, 150, 90, 26);
            jp_2.add(jbArray_2[i]);
            jbArray_2[i].addActionListener(this);
        }
        //初始化姓名框并监听
        jtxtName_2.setBounds(135, 20, 180, 30);
        jp_2.add(jtxtName_2);
        jtxtName_2.addActionListener(this);

        //初始化密码框并监听
        jtxtPassword_2_1.setBounds(135, 60, 180, 30);
        jp_2.add(jtxtPassword_2_1);
        jtxtPassword_2_1.addActionListener(this);

        //初始化确认密码框并监听
        jtxtPassword_2_2.setBounds(135, 100, 180, 30);
        jp_2.add(jtxtPassword_2_2);
        jtxtPassword_2_2.addActionListener(this);

        //初始化注册提示
        jlArray_2[3].setBounds(40, 195, 300, 30);
        jp_2.add(jlArray_2[3]);

        //初始化返回键并监听
        jbArray_2[2].setBounds(300, 195, 60, 30);
        jp_2.add(jbArray_2[2]);
        jbArray_2[2].addActionListener(this);

        return jp_2;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //获取卡片布局管理器引用
        CardLayout cl=(CardLayout)jp.getLayout();
        //跳到下一个文字框
        if(e.getSource()==jtxtName){
            jtxtPassword.requestFocus();
        //清空
        }else if(e.getSource()==jbArray[1]){
            jlArray[2].setText("");
            jtxtPassword.setText("");
            jtxtName.setText("");
            jtxtName.requestFocus();
        //登录判定
        }else if(e.getSource()==jbArray[0]){
                //如果用户名框不为空
                if(!jtxtName.getText().equals("")){
                    System.out.println(""); 
                    System.out.println("正在验证密码..."); 
                //接受判定程序的返回值
                String str=Verification(jtxtName.getText(),String.valueOf(jtxtPassword.getPassword()));
                //登陆成功
                if(str.equals("PasswordTrue")){
                    //String.valueOf 的作用是将输进来的密码强制转换为String类型
                    jlArray[2].setText("恭喜你登录成功!!!");
                //密码错误
                }else if(str.equals("PasswordFalse")){
                    jlArray[2].setText("对不起,密码错误!!!");
                    jtxtPassword.setText("");
                    jtxtPassword.requestFocus();
                //用户名不存在
                }else if(str.equals("NameNull")){
                    jlArray[2].setText("对不起,用户名不存在!!!");
                    jtxtName.requestFocus();
                //未知错误
                }else{
                    jlArray[2].setText("未知错误!!!");
                }
            }
            /*                            */        
            /*          注册页面                                  */    
            /*                            */    
        //转到注册界面
        }else if(e.getSource()==jbArray[2]){
            System.out.println(""); 
            System.out.println("/************进入注册界面************/"); 
            //卡片式布局转为注册界面
            cl.show(jp,"register");
            //清空选框,并专注于用户名框
            jlArray_2[3].setText("");
            jtxtPassword_2_1.setText("");
            jtxtPassword_2_2.setText("");
            jtxtName_2.setText("");
            jtxtName_2.requestFocus();
        //清空
        }else if(e.getSource()==jbArray_2[1]){
            jlArray_2[3].setText("");
            jtxtPassword_2_1.setText("");
            jtxtPassword_2_2.setText("");
            jtxtName_2.setText("");
            jtxtName_2.requestFocus();
        //返回到登录界面
        }else if(e.getSource()==jbArray_2[2]){
            System.out.println(""); 
            System.out.println("/************进入登录界面************/"); 
            //卡片式布局转为登录界面
            cl.show(jp, "sign");
            //清空选框,并专注于用户名
            jlArray[2].setText("");
            jtxtPassword.setText("");
            jtxtName.setText("");
            jtxtName.requestFocus();
        //跳到下一个选框
        }else if(e.getSource()==jtxtName_2){
            jtxtPassword_2_1.requestFocus();
        }else if(e.getSource()==jtxtPassword_2_1){
            jtxtPassword_2_2.requestFocus();
        //点击注册界面
        }else if(e.getSource()==jbArray_2[0]){
                //用户名框不为空
                if(!jtxtName_2.getText().equals("")){
                    //两次输入的密码不一样
                    if(!String.valueOf(jtxtPassword_2_1.getPassword()).equals
                        (String.valueOf(jtxtPassword_2_2.getPassword()))){
                    jlArray_2[3].setText("两次密码不一样!");
                    jtxtPassword_2_1.setText("");
                    jtxtPassword_2_2.setText("");
                    jtxtPassword_2_1.requestFocus();
                    System.out.println(""); 
                    System.out.println("密码不相同禁止存入..."); 
                }else{
                    System.out.println(""); 
                    System.out.println("正在验证用户名是否合法..."); 
                    //获得注册函数的返回值
                    String str=signUser(jtxtName_2.getText(),String.valueOf(jtxtPassword_2_1.getPassword()));
                    //用户名已存在
                    if(str.equals("exist")){
                        jlArray_2[3].setText("用户名已存在!");
                        jtxtName_2.requestFocus();
                    //注册成功
                    }else if(str.equals("signed")){
                        jlArray_2[3].setText("注册成功!!!");
                    //发生未知错误,未成功
                    }else if(str.equals("false")){
                        jlArray_2[3].setText("未注册,发生未知错误!");
                    //发生未知错误
                    }else{
                        jlArray_2[3].setText("发生未知错误!");
                    }
                }       
            }
        }
    }

    public void conDatabase(){                                              //连接数据库
        try {
            //加载驱动,此时你要保证你有mysql-connector-java这个包
            Class.forName("com.mysql.jdbc.Driver");
            //初始化数据库的地址,此时最后面的是你自己的数据库名字
            String url = "jdbc:mysql://localhost:3306/averagecredit" ;
            //连接数据库的用户名和密码,一般默认用户名就是root
            String username = "root" ;   
            String password = "aaa321" ;  
            //连接数据库
            con=DriverManager.getConnection(url , username , password ) ; 
            System.out.println("数据库连接主类成功!"); 
        } catch (ClassNotFoundException e) {
            System.out.println("找不到驱动程序类 ,加载驱动失败!"); 
            e.printStackTrace();
            System.exit(1);
        } catch (SQLException e) {
            System.out.println("数据库连接主类失败!"); 
            e.printStackTrace();
            System.exit(1);
        }
    }


    /*这里用的是,将需要验证或者存入的用户名和密码传递给函数,
     * 然后函数经过处理验证后,返回不同的字符串来判定用户是否合法*/

    public String Verification(String name,String password){
        //字符串返回值
        String reStr="";
        //初始化标记,若标记为0则表示用户名不村子,不为0则为用户存在
        int mark=0;
        try {
            //连接SignIn表单
            String sql = "select * from SignIn ";
            PreparedStatement preStmt =con.prepareStatement(sql); 
            //执行查询操作
            ResultSet rs = preStmt.executeQuery(); 
            //依次遍历表单
            while(rs.next()){
                //将获取到的表单每个元素的名字与传递的名字对比,查找是否存在用户
                if(rs.getString(1).equals(name)){
                    mark=1;
                    //密码正确
                    if(rs.getString(2).equals(password)){
                        reStr="PasswordTrue";
                        System.out.println("密码正确");
                    //密码不正确
                    }else{
                        reStr="PasswordFalse";
                        System.out.println("密码错误");
                    }
                }
            }
            //用户名不存在
            if(mark==0){
                reStr="NameNull";
                System.out.println("用户名不存在");
            }
            //关闭数据流
            rs.close();
            preStmt.close();
        } catch (SQLException e) {
            System.out.println("数据库查询连接失败!"); 
            e.printStackTrace();
        }

        return reStr;
    }

    public String signUser(String name,String password){
        //创建获取用户名名字的表单
        ArrayList<String> namelist=new ArrayList<>();
        //字符返回值
        String str="";
        //用户是否存在的标记值和判定是否存入的标记
        int i=0,mark=0;
        try {
            //连接SignIn表单
            String sql = "select * from SignIn ";
            PreparedStatement preStmt;
            preStmt = con.prepareStatement(sql);
            ResultSet rs = preStmt.executeQuery(); 
            //获取所有的用户名
            while(rs.next()){
                namelist.add(rs.getString(1));
            }
            rs.close();
            //将数据库里的用户名与需要注册的用户名进行对比
            for(String s:namelist){
                if(s.equals(name)){
                    str="exist";
                    System.out.println("用户已存在");
                    mark=1;
                }
            }
            //如果标记为0,则表示用户名不存在
            if(mark==0){
                //需要插入SignIn表单中的Name和Password元素
                String sql2="insert into SignIn(Name,Password) values(?,?)";
                PreparedStatement preStmt2 =con.prepareStatement(sql2); 
                //插入Name元素
                preStmt2.setString(1,name);
                //插入Password元素
                preStmt2.setString(2, password);
                //获取返回值,i为1,则表示成功,为0则表示失败
                i=preStmt2.executeUpdate(); 
                //关闭连接
                preStmt2.close();
                if(i==1){
                    str="signed";
                    System.out.println("成功存入!");
                }else{
                    str="false";
                    System.out.println("未存入,发生未知错误!");
                }
            }
            rs.close();
            preStmt.close();
        } catch (SQLException e) {
            System.out.println("数据库存入连接失败!"); 
            e.printStackTrace();
        } 
        //返回字符串
        return str;
    }

    public static void main(String[] args) {
        new PassWord();
    }

}

下面是本程序运行出来的登录界面,此时显示的是登陆成功
这里写图片描述

下面则是用户注册成功的界面。
这里写图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值