zoukankan      html  css  js  c++  java
  • Java swing GUI小程序入门 之天天美食外卖系统(2)

    环境:java1.8+ Mysql8.0.22 +idea
    //登录功能的实现
    相比系统主frame而言登录franme要更为复杂些
    先分析一下登录页都有哪些功能

     如图所示,最原始的登录页功能简陋,只有登录和注册两个选项,所以基本思路便是实现登录按钮和注册按钮的监听,用户点击后执行各自的事件函数。除此之外,用户输入用户名和密码是也有一些细节要注意,分为一下几种情况:用户名密码为空;用户名或密码错误;连接数据库错误。下面来逐步实现登录功能:

    1.创建登录需要的组件

    private JLabel userLabel;
    private JLabel passwordLabel;
    private JTextField userField;
    private JPasswordField passwordField;
    private JButton loginButton;
    private JButton registButton;

    2.设置登录页窗口
    public Login(){
    //设置登录页面属性
    this.setTitle("登录");
    this.setVisible(true);
    this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    this.setSize(300,250);
    //初始化登录页
    this.init();
    //注册监听事件
    this.loginButton.addActionListener(this);
    this.registButton.addActionListener(this);
    this.passwordField.addActionListener(this);//负责监听enter键

    }

    3.对登录页面进行初始化
    private void init(){
    //设置初始化登录页面内容
    this.userLabel=new JLabel("用户名:");
    this.passwordLabel=new JLabel("密码:");
    this.userField=new JTextField(24);
    this.passwordField=new JPasswordField(18);
    this.loginButton=new JButton("登录");
    this.registButton=new JButton("注册");
    //设置布局
    this.setLayout(null);
    this.add(this.userLabel).setBounds(40, 40, 80, 30);
    this.add(this.userField).setBounds(100, 40, 120, 30);
    this.add(this.passwordLabel).setBounds(40, 100, 80, 30);
    this.add(this.passwordField).setBounds(100, 100, 120, 30);
    this.add(this.loginButton).setBounds(80, 160, 60, 25);
    this.add(this.registButton).setBounds(160, 160, 60, 25);

    }

    4.重写监听函数actionPerformed()
    @Override
    public void actionPerformed(ActionEvent e) {
    if(e.getSource()==this.loginButton){
    this.loginButton_actionPerformed();
    }
    if(e.getSource()==this.registButton){
    this.registButton_performed();
    }
    if(e.getSource()==this.passwordField){
    this.loginButton_actionPerformed();
    }
    }

    5.实现登录按钮点击事件
    public void loginButton_actionPerformed(){
    /*登录按钮的事件*/
    //获取用户输入的用户名及密码
    String username =this.userField.getText().trim(); //getText()得到的就是String可以直接用trim()方法
    String password =new String(this.passwordField.getPassword()).trim();//注意:getPassword()得到的是个char[]数组
    //连接数据库
    String url ="jdbc:mysql://localhost:3306/dailybase";
    Connection con = null;
    Statement sta = null;
    ResultSet rs = null;
    //设置判断标志
    Boolean flag =false;
    if(!username.equals("")&&!password.equals("")){
    try{
    Class.forName("com.mysql.cj.jdbc.Driver");//创建驱动
    con = DriverManager.getConnection(url,"root","password");//获取连接
    if(con==null){
    JOptionPane.showMessageDialog(this,"连接数据库出错,请重试","警告",JOptionPane.WARNING_MESSAGE);
    con.close();//回收资源
    }else {
    String sql = "select * from buyer where name='"+username+"' and password ='"+password+"'";//构造查询用户账号信息的sql
    sta = con.createStatement();//从连接中创建sql执行器
    rs =sta.executeQuery(sql);
    while (rs.next()){
    //判断是否存在改用户
    String u_username =rs.getString("name");
    String u_password =rs.getString("password");
    if(u_username.equals(username)&&u_password.equals(password)){
    flag=true;
    }
    }
    if(flag==true){
    this.setVisible(false); //登录成功后隐藏登录窗口
    MainFrame frame = new MainFrame();  //弹出提前写好的系统主窗口
    }
    else {
    JOptionPane.showMessageDialog(this,"用户名或密码输入错误,请重新输入","警告",JOptionPane.WARNING_MESSAGE);
    this.passwordField.setText("");
    }
    }

    }catch (Exception e){
    e.printStackTrace();
    JOptionPane.showMessageDialog(this, "连接数据库出错,请重试", "警告", JOptionPane.WARNING_MESSAGE);
    this.userField.setText("");
    this.passwordField.setText("");
    }
          /*这样回收资源的好处:不论程序是否抛出异常都不会浪费系统资源;并且后创建的re应该先回收,其次是sta,再然后是con;为了方便起见可以自己写一个回收资源的函数这样写一次就可以一直复用十分好用的小技巧 */
         finally { //关闭所有连接回收系统资源
    try{
    if(rs!=null) rs.close();
    } catch (SQLException e){
    e.printStackTrace();
    }finally {
    try{
    if(sta!=null) sta.close();
    } catch (SQLException e){
    e.printStackTrace();
    }
    finally {
    try{
    if(con!=null) con.close();
    } catch (SQLException e){
    e.printStackTrace();
    }
    finally {
    return;
    }
    }
    }


    }
    }else {
    JOptionPane.showMessageDialog(this, "请完善登录信息", "警告", 2);
    }

    注册按钮的事件还没写完见下一篇吧
    老规矩写个测试函数测试一下功能,截图如下
    1.未完善登录信息的测试:
    
    

    2.输入不正确的用户名及密码:

    
    

    3.正确输入按下回车:

    登录窗口消失,系统主窗口弹出

     综上登录功能实现,当然还有很多不足的地方需要继续完善。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    ps:补充一下数据库的构建

    数据库构建代码如下:

    set names gbk; //设置为gbk编码
    drop database dailybase;
    create database dailybase;//创建数据库
    use dailybase; //使用数据库

    /* 建立用户表 */

    CREATE TABLE buyer
    (
    id varchar(30),
    name varchar(30),
    password varchar(20),
    age int(2),
    sex varchar(10),
    phone varchar(11),
    address varchar(50),
    PRIMARY KEY (id)
    );

    //添加测试用例
    insert into buyer(id, name, password, age, sex, phone, address) values('0323', 'qkq', 'qkq', 18, 'M', '17856542333', '629');
    insert into buyer(id, name, password, age, sex, phone, address) values('101', 'a001', 'a001', 18, 'M', '13011112222', 'ZhengzhouCity');
    insert into buyer(id, name, password, age, sex, phone, address) values('102', 'a002', 'a002', 23, 'F', '13011113333', 'WuhanCity');
    insert into buyer(id, name, password, age, sex, phone, address) values('103', 'a003', 'a003', 31, 'M', '13055556666', 'XianCity');
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    



     


  • 相关阅读:
    Python注释及变量
    MySQL期末测试
    SQL查询第三次训练(重点关照对象)
    MySQL内置函数
    聚类-kmeans
    《达.芬奇密码》丹-布朗
    皮克定理与证明
    常见设计模式的种类与一些原则
    时间序列(二)分解、各部分计算方法
    ADF检验
  • 原文地址:https://www.cnblogs.com/qkq505/p/14763807.html
Copyright © 2011-2022 走看看