swing 實現使用者登入註冊介面(不使用資料庫)

classic123發表於2022-03-23

swing 實現使用者登入註冊介面(不使用資料庫)

實現的功能

  • 先說一下具體實現的功能吧:使用者註冊後會將註冊的物件存入記憶體中,登入時會遍歷註冊的物件列表,判斷是否登入成功;

  • 登入和註冊介面:

  • 本次實驗分為六個模組

    • 登入介面 (兩個輸入框,兩個按鈕)
    • 註冊介面 (兩個輸入框,兩個按鈕)
    • 監聽器 (跳轉頁面,彈出提示框等功能)
    • 登入輸入類 (用來把登陸介面輸入框內的資料傳給監聽器,讓監聽器判斷是否可以成功登入)
    • 註冊輸入類 (用來把註冊介面輸入框內的資料傳給監聽器,便於監聽器建立新的使用者類,存入userList中)
    • 使用者類

實現過程

  • 登入介面
import javax.swing.*;
import java.awt.*;
public class LoginUI {
    public void initUI(){
        JFrame jf = new JFrame("登入介面");
        jf.setSize(500,700);
        jf.setLocationRelativeTo(null);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        
        FlowLayout flow = new FlowLayout(); //使用流式佈局
        jf.setLayout(flow);
        
        //注意調整圖片尺寸,圖片比框體大的話會無法顯示,此處圖片尺寸為500*498。
        // 我是使用WPS會員進行調整的,歡迎網友提出更好的方法。
        ImageIcon image = new ImageIcon("C:\\Users\\13630\\Pictures\\衡水二中.jpg");
        JLabel imageJla = new JLabel(image);
        
        JLabel nameJla = new JLabel("賬號:");
        JLabel pwdJla = new JLabel("密碼:");
        
        //為輸入框設定大小
        Dimension dim = new Dimension(400,35); 
        JTextField nameInput = new JTextField();
        JPasswordField pwdInput = new JPasswordField();
        
        nameInput.setPreferredSize(dim); 
        pwdInput.setPreferredSize(dim);

        JButton btn1 = new JButton("登入");
        JButton btn2 = new JButton("註冊");
        
        jf.add(imageJla);
        jf.add(nameJla);
        jf.add(nameInput);
        jf.add(pwdJla);
        jf.add(pwdInput);
        jf.add(btn1);
        jf.add(btn2);
        //建立監聽器
        LoginListener loginListener = new LoginListener();
        //將輸入框傳給監聽器的成員變數loginInput
        loginListener.loginInput.setNameInput(nameInput);
        loginListener.loginInput.setPwdInput(pwdInput);
        //給按鈕加上監聽器
        btn1.addActionListener(loginListener);
        btn2.addActionListener(loginListener);
        jf.setVisible(true);  //視覺化
    }

    public static void main(String[] args) {
        new LoginUI().initUI();
    }
}
  • 註冊介面
import javax.swing.*;
import java.awt.*;

/**
 * 設計邏輯與登入介面基本相同
 */
public class RegistUI {
    public void initUI(LoginListener loginListener){
        JFrame jf = new JFrame("註冊介面");
        jf.setSize(500,700);
        jf.setLocationRelativeTo(null);
        jf.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        FlowLayout flow = new FlowLayout();
        jf.setLayout(flow);
        
        ImageIcon image = new ImageIcon("C:\\Users\\13630\\Pictures\\衡水二中.jpg");

        JLabel nameJla = new JLabel("請輸入你的賬號:");
        JLabel pwdJla = new JLabel("請輸入你的密碼:");
        JLabel imageJla = new JLabel(image);

        Dimension dim = new Dimension(340,35);
        
        JTextField nameInput = new JTextField();
        JPasswordField pwdInput = new JPasswordField();
        nameInput.setPreferredSize(dim);
        pwdInput.setPreferredSize(dim);

        JButton btn1 = new JButton("確定");
        JButton btn2 = new JButton("取消");
        
        jf.add(imageJla);
        jf.add(nameJla);
        jf.add(nameInput);
        jf.add(pwdJla);
        jf.add(pwdInput);
        jf.add(btn1);
        jf.add(btn2);
        //將輸入框傳給監聽器的成員變數registInput
        loginListener.registInput.setNameInput(nameInput);
        loginListener.registInput.setPwdInput(pwdInput);
        
        btn1.addActionListener(loginListener);
        btn2.addActionListener(loginListener);
        jf.setVisible(true);
    }
    
}
  • 監聽器
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class LoginListener implements ActionListener {
    //為了將兩個輸入框中的內容傳進監聽器中,我們將兩個輸入框封裝成一個類,作為監聽器的成員變數,同時在登入和註冊介面中,將輸入框傳入該類。
    RegistInput registInput = new RegistInput(); 
    LoginInput loginInput = new LoginInput(); //同上
    ArrayList<User> userList = new ArrayList<>();
    @Override
    public void actionPerformed(ActionEvent e){
        String action = e.getActionCommand();
        
        if(action.equals("登入")){
            //沒有被註冊時,直接輸出:使用者名稱不存在!!
            if(userList.size()==0){
                JOptionPane.showMessageDialog (null, "使用者名稱不存在!!");
            }
            //將輸入框中的字串取出來放在name,pwd中
            String name = loginInput.getNameInput().getText();
            String pwd = loginInput.getPwdInput().getText();
            boolean nameExist = false; //用nameExist記錄在遍歷過程中,是否找到登入時使用的使用者名稱
            //遍歷List集合,判斷能否登入成功或登入失敗的原因
            for(User u : userList){
                if(u.name.equals(name)){
                    nameExist = true;
                    if(u.pwd.equals(pwd)){
                        JOptionPane.showMessageDialog (null, "登入成功!!");
                        break;
                    }else{
                        JOptionPane.showMessageDialog (null, "密碼錯誤!!");
                        break;
                    }
                }
            }
          if(!nameExist){
            JOptionPane.showMessageDialog (null, "使用者名稱不存在!!");
          }

        }else if(action.equals("註冊")){
            RegistUI registUI = new RegistUI();
            registUI.initUI(this);
        }else if(action.equals("確定")){
            //輸入框中的資料建立一個user物件,加入到List集合中
            String name = registInput.getNameInput().getText();
            String pwd = registInput.getPwdInput().getText();
            User user = new User(name,pwd);
            userList.add(user);
            JOptionPane.showMessageDialog (null, "註冊成功!!");
        }else if(action.equals("取消")){
            System.exit(0); //退出
        }

    }
}
  • 登入輸入類
import javax.swing.*;

public class LoginInput {
    JTextField nameInput = null;
    JPasswordField pwdInput = null;

    public JTextField getNameInput() {
        return nameInput;
    }

    public void setNameInput(JTextField nameInput) {
        this.nameInput = nameInput;
    }

    public JPasswordField getPwdInput() {
        return pwdInput;
    }

    public void setPwdInput(JPasswordField pwdInput) {
        this.pwdInput = pwdInput;
    }
}

  • 註冊輸入類
import javax.swing.*;

public class RegistInput {
    JTextField nameInput = null;
    JPasswordField pwdInput = null;

    public JTextField getNameInput() {
        return nameInput;
    }

    public void setNameInput(JTextField nameInput) {
        this.nameInput = nameInput;
    }

    public JPasswordField getPwdInput() {
        return pwdInput;
    }

    public void setPwdInput(JPasswordField pwdInput) {
        this.pwdInput = pwdInput;
    }
}
  • 使用者類
public class User {
    String name;
    String pwd;
    User(String name,String pwd){
        this.name = name;
        this.pwd = pwd;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

遇到的問題

  • ①給button加上Dimension之後,button裡的字變成了...,原因是Dimensoin的大小設定的太小了。
  • ②登陸介面和註冊介面的loginListen是兩個物件,如何將註冊頁面的監聽器的List集合傳給登入介面的監聽器?
  • 解決方法:我們可以使用一個監聽器物件,將登陸介面的監聽器作為引數傳入註冊介面。
  • ③監聽器的方法中,使用this來表示監聽器本身,程式碼實現:
if(action.equals("註冊")){
    RegistUI registUI = new RegistUI();
    registUI.initUI(this);
}

相關文章