JAVA实现QQ登录、注册、修改密码等功能(美化版)
本專欄將從基礎開始,循序漸進,由淺入深講解Java的基本使用,希望大家都能夠從中有所收獲,也請大家多多支持。
專欄地址:26天高效學習Java編程
相關軟件地址:軟件地址
所有代碼地址:代碼地址
如果文章知識點有錯誤的地方,請指正!大家一起學習,一起進步。
文章目錄
- 項目結構及結果展示
- 代碼展示
- MainFrame模塊
- RegisterUI模塊
- RegisterUI模塊
- JDBC模塊
大家好,今天用Java的awt組件、swing組件以及數據庫JDBC寫了一個仿QQ登錄的界面,具體演示如下圖所示,包括三個頁面,分別是登錄窗口(MainFrame)、注冊窗口(RegisterUI)和忘記密碼窗口(ForgetUI)。本文主要應用的技術有:JAVA-GUI、JAVA的awt組件、swing組件、事件處理、JDBC等,是初學者學習和練手的好項目。準備好了嗎,let’s get it!
項目結構及結果展示
該項目的結構如下圖所示:
主要有三個類:
- MainFrame是登錄窗口的GUI類,效果圖如下:
- RegisterUI是注冊窗口的GUI類,效果圖如下:
- ForgetUI是忘記密碼窗口的GUI類,效果圖如下:
代碼展示
在進行代碼展示前,先對Swing組件常見的控件類進行介紹,Swing組件常見的控件類有以下幾種:
JLabel 標簽主要用于展示 文本 或 圖片,也可以 同時顯示文本和圖片
JButton 點擊事件
JTextArea 編輯單行的文本框
JPasswordArea 一個只能輸入數字的密碼框 把輸入的內容用其他字符回顯
JTabledPlan 選項卡面板。它允許用戶通過點擊給定標題或圖標的選項卡,在一組組件之間進行切換顯示
JCheckBox 復選框,是否被選中
JPanel相當于將整個窗體劃分成幾個面板,然后在面板中使用布局管理器(管理按鈕的布局)一個窗口只能有一個JFrame,能有多個JPlanel
Imagin.SCALE_DEFAULT 自適應JLabel的大小
getScaledInstance 創建此圖像的縮放版本。返回一個新的 image 對象,默認情況下,該對象按指定的 width 和 height 呈現圖像。即使已經完全加載了初始源圖像,新的 image 對象也可以被異步加載
SetIcon圖標將會被自動地放到按鈕的上面,缺省時居中放置
setborderpainted 如果進度條應該繪制邊框,則為 true;否則為 false
MainFrame模塊
MainFrame的布局如下圖所示:
MainFrame的代碼如下:
package Frame;import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.GridLayout; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener;import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField;public class MainFrame extends JFrame implements ActionListener, FocusListener {private static final long serialVersionUID = 1L;private static final String _txt_account = "QQ密碼/手機/郵箱";private static final String _txt_pwd = "密碼";private static final String _txt_title = "QQ登錄";private static final String _txt_registe = "注冊";private static final String _txt_forget = "忘記密碼";private static final String _txt_blank = "";private JTextField account;private JPasswordField pwd;private JLabel upper_frame;private JPanel lower_frame, center_frame;private JButton login, register, forget;MainFrame() {//控件的初始化init();add(upper_frame, BorderLayout.NORTH);add(center_frame, BorderLayout.CENTER);add(lower_frame, BorderLayout.SOUTH);ImageIcon logo = new ImageIcon("D:/image/logo.jpg"); //左上方小圖標setIconImage(logo.getImage());setBounds(500, 230, 430, 360); //設定大小及位置setResizable(false); //登錄框大小固定,不允許通過拖、拉改變大小setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); //設置窗口右上角的叉號,點擊叉號窗口關閉 注意不能EXIT_ON_CLOSE做參數的,用它時候使用的是System.exit方法退出應用程序。故會關閉所有窗口。setTitle(_txt_title);setVisible(true); //說明數據模型已經構造好了,允許JVM可以根據數據模型執行paint方法開始畫圖并顯示到屏幕上,一般放在最后一句}public void init() {//賬號輸入塊account = new JTextField(_txt_account);account.setName("account");account.setForeground(Color.gray);account.addFocusListener(this); //產生事件響應用戶行為//密碼輸入塊pwd = new JPasswordField(_txt_pwd);pwd.setName("pwd");pwd.setForeground(Color.gray);pwd.setEchoChar('\0'); //啟動后密碼框內一定為 “密碼”pwd.addFocusListener(this);//注冊模塊register = new JButton(_txt_registe);register.setBorderPainted(false);register.setBorder(BorderFactory.createRaisedBevelBorder()); //斜面邊框(凸)register.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); register.addActionListener(this);//忘記密碼模塊forget = new JButton(_txt_forget);forget.setBorderPainted(false);forget.setBorder(BorderFactory.createRaisedBevelBorder());forget.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); forget.addActionListener(this);//login按鈕模塊login = new JButton();ImageIcon login_image = new ImageIcon("D:/image/login_image.png");login_image.setImage(login_image.getImage().getScaledInstance(430, 35, Image.SCALE_DEFAULT));login.setIcon(login_image);login.setBackground(Color.white);login.setBorderPainted(false); //如果進度條應該繪制邊框,則為 true;否則為 falselogin.setBorder(null); //設置此組件的邊框 無login.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); //將光標設為 “小手”形狀login.addActionListener(this);//qq登錄框架上半部分(無按鈕之類的內容,只有一張圖片)ImageIcon upper_image = new ImageIcon("D:/image/upper_image.png");upper_image.setImage(upper_image.getImage().getScaledInstance(430, 160, Image.SCALE_DEFAULT));upper_frame = new JLabel(upper_image);//qq登錄中間部分 (賬號、密碼、 注冊、forget)center_frame = new JPanel();center_frame.setName("center_frame");center_frame.setLayout(null);center_frame.setLayout(new GridLayout(3, 3, 3, 15)); //這里用到3行3列的空間, 用空格填充center_frame.add(new JLabel(_txt_blank, JLabel.CENTER));center_frame.add(account);center_frame.add(new JLabel(_txt_blank, JLabel.CENTER));center_frame.add(new JLabel(_txt_blank, JLabel.CENTER));center_frame.add(pwd);center_frame.add(new JLabel(_txt_blank, JLabel.CENTER));center_frame.add(register);center_frame.add(new JLabel(_txt_blank, JLabel.CENTER));center_frame.add(forget);center_frame.setBackground(Color.white);//qq登錄框架的下半部分loginlower_frame = new JPanel();lower_frame.setName("lower_frame");lower_frame.setLayout(null);//lower_frame.setLayout(new GridLayout(1, 3, 3, 15));lower_frame.setLayout(new GridLayout(0, 1)); lower_frame.add(login);}//按鈕的點擊事件用actionPerformed@Overridepublic void actionPerformed(ActionEvent e){/** 1:如果點擊了登錄按鈕 首先判斷帳號或者密碼是否為空 * 2:如果點擊了注冊賬號就彈出注冊頁面* 3:如果點擊了忘記密碼彈出找回密碼頁面*///處理登錄(login)頁面if(e.getSource() == login){String user_name = account.getText().trim();String user_pwd = new String(pwd.getPassword()).trim();if("".equals(user_name)) {JOptionPane.showMessageDialog(null, "請輸入帳號!!");return;}if("".equals(user_pwd)) {JOptionPane.showMessageDialog(null, "請輸入密碼!!");return;}}//處理注冊(register)頁面if(e.getSource() == register){RegisterUI registerUI = new RegisterUI(this);}//處理找回密碼(forget)頁面if(e.getSource() == forget){ForgetUI forgetUI = new ForgetUI(this);}}//鼠標的點擊或移動之類的用focuslistener@Overridepublic void focusGained(FocusEvent e) {//處理賬號輸入框if(e.getSource() == account){if(_txt_account.equals(account.getText())){account.setText("");account.setForeground(Color.BLACK);}}//處理密碼輸入框if(e.getSource() == pwd){if(_txt_pwd.equals(pwd.getText())){pwd.setText("");pwd.setEchoChar('*');pwd.setForeground(Color.BLACK);}}}@Overridepublic void focusLost(FocusEvent e) {//處理賬號輸入框if(e.getSource() == account){if("".equals(account.getText())){account.setForeground(Color.gray);account.setText(_txt_account);}}//處理密碼輸入框if(e.getSource() == pwd){if("".equals(pwd.getText())){pwd.setForeground(Color.gray);pwd.setText(_txt_pwd);pwd.setEchoChar('\0');}}}public static void main(String[] args) {MainFrame mainframe = new MainFrame();}}RegisterUI模塊
RegisterUI的布局和MainFrame的類似,如下圖所示:
RegisterUI的代碼如下:
package Frame;import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.GridLayout; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener;import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField;public class RegisterUI extends JFrame implements ActionListener, FocusListener {private static final long serialVersionUID = 1L;private JLabel upper_N, user_name_txt, user_pwd_txt, user_ques_txt, user_ans_txt; //顯示文字用private JButton register_button_S;private JTextField user_name, user_pwd, user_ques, user_ans; //在這里面獲取用戶輸入private JPanel tmp_South, center_Center;private MainFrame mainFrame; //用于關閉登錄頁面 如果注冊成功則將剛開始的注冊頁面關閉public RegisterUI(MainFrame mainFrame) {this.mainFrame = mainFrame;//初始化界面init();//合成整體add(center_Center, BorderLayout.CENTER);add(upper_N, BorderLayout.NORTH);add(tmp_South, BorderLayout.SOUTH);//位置、頁面大小設置setSize(250, 400);setLocation(550, 300);ImageIcon logo = new ImageIcon("D:/image/register_image.png"); //左上方小圖標setIconImage(logo.getImage());setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);setResizable(false);setVisible(true);}public void init() {//上方圖片部分構造 上 即為 北ImageIcon upper_image = new ImageIcon("D:/image/register_background_image.jpg");upper_image.setImage(upper_image.getImage().getScaledInstance(250, 139,Image.SCALE_DEFAULT));upper_N = new JLabel(upper_image);//下方注冊圖片構造 下 即為 南tmp_South = new JPanel(); //作為一個容器來放確認注冊按鈕register_button_S = new JButton();ImageIcon conform_register_image = new ImageIcon("D:/image/conform_register_image.png");conform_register_image.setImage(conform_register_image.getImage().getScaledInstance(220, 40, Image.SCALE_DEFAULT));register_button_S.setIcon(conform_register_image);// 不繪制邊框register_button_S.setBorderPainted(false);// 設置邊框為空register_button_S.setBorder(null);register_button_S.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));register_button_S.addActionListener(this); //產生事件響應用戶行為tmp_South.add(register_button_S);//中間部分內容center_Center = new JPanel();user_name_txt = new JLabel("用戶賬號", JLabel.CENTER);user_pwd_txt = new JLabel("用戶密碼", JLabel.CENTER);user_ques_txt = new JLabel("提示問題", JLabel.CENTER);user_ans_txt = new JLabel("問題答案", JLabel.CENTER);user_name = new JTextField();user_pwd = new JTextField();user_ques = new JTextField();user_ans = new JTextField();user_name.addFocusListener(this);user_pwd.addFocusListener(this);user_ans.addFocusListener(this);user_ques.addFocusListener(this);center_Center.setLayout(new GridLayout(4, 2));center_Center.add(user_name_txt);center_Center.add(user_name);center_Center.add(user_pwd_txt);center_Center.add(user_pwd);center_Center.add(user_ques_txt);center_Center.add(user_ques);center_Center.add(user_ans_txt);center_Center.add(user_ans);}public void actionPerformed(ActionEvent e) {/** 如果點擊了登錄按鈕 首先判斷帳號或者密碼是否為空*/if (e.getSource() == register_button_S) {String username = user_name.getText().trim();String password = user_pwd.getText().trim();String userques = user_ques.getText().trim();String userans = user_ans.getText().trim();if ("".equals(username) || username == null) {JOptionPane.showMessageDialog(null, "請輸入帳號!!");return;}if ("".equals(password) || password == null) {JOptionPane.showMessageDialog(null, "請輸入密碼!!");return;}if ("".equals(userques) || userques == null) {JOptionPane.showMessageDialog(null, "請輸入問題!!");return;}if ("".equals(userans) || userans == null) {JOptionPane.showMessageDialog(null, "請輸入答案!!");return;}}}//鼠標的點擊或移動之類的用focuslistener@Overridepublic void focusGained(FocusEvent e) {//處理賬號輸入框if(e.getSource() == user_name){user_name.setForeground(Color.BLACK);}//處理密碼輸入框if(e.getSource() == user_pwd){user_pwd.setForeground(Color.BLACK);}//處理問題輸入框if(e.getSource() == user_ques){user_ques.setForeground(Color.BLACK);}//處理答案輸入框if(e.getSource() == user_ans){user_ans.setForeground(Color.BLACK);}}@Overridepublic void focusLost(FocusEvent e) {//處理賬號輸入框if(e.getSource() == user_name){user_name.setForeground(Color.gray);}//處理密碼輸入框if(e.getSource() == user_pwd){user_pwd.setForeground(Color.gray);}//處理問題輸入框if(e.getSource() == user_ques){user_ques.setForeground(Color.gray);}//處理答案輸入框if(e.getSource() == user_ans){user_ans.setForeground(Color.gray);}}}RegisterUI模塊
為了掌握多種布局方式,這里RegisterUI采用的是絕對布局,相關代碼如下:
package Frame;import java.awt.Color; import java.awt.Cursor; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener;import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTextField;public class ForgetUI extends JFrame implements ActionListener, FocusListener{private static final long serialVersionUID = 1L;private JLabel upper_N, user_name_txt, user_pwd_txt, user_ques_txt, user_ans_txt, user_ques; //顯示文字用private JButton forget_button_S, submit_button;private JTextField user_name, user_pwd, user_ans; //在這里面獲取用戶輸入private MainFrame mainFrame; //用于關閉登錄頁面 如果修改密碼成功則將剛開始的注冊頁面關閉public ForgetUI(MainFrame mainFrame) {this.mainFrame = mainFrame;//頁面構造init();//合成整體add(upper_N);add(user_name_txt);add(user_name);add(submit_button);add(user_ques_txt);add(user_ques);add(user_ans_txt);add(user_ans);add(user_pwd_txt);add(user_pwd);add(forget_button_S);//位置、頁面大小設置setSize(270, 430);setLocation(550, 300);setLayout(null); //手工布局 與其他頁面不同 ImageIcon logo = new ImageIcon("D:/image/register_image.jpg"); //左上方小圖標setIconImage(logo.getImage());setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);setResizable(false);setVisible(true); }public void init() {//上方圖片部分構造 上 即為 北ImageIcon upper_image = new ImageIcon("D:/image/forget_background_image.png");upper_image.setImage(upper_image.getImage().getScaledInstance(270, 170,Image.SCALE_DEFAULT));upper_N = new JLabel(upper_image);upper_N.setLocation(0,0); //確定位置upper_N.setSize(270, 170); //設置大小//中間部分內容 絕對位置user_name_txt = new JLabel("用戶賬號", JLabel.CENTER);user_name_txt.setSize(60, 20);user_name_txt.setLocation(10, 185);submit_button = new JButton();submit_button.setText("查詢");submit_button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));submit_button.setSize(60, 20);submit_button.setLocation(190, 185);submit_button.addActionListener(this); //產生事件響應用戶行為user_ques_txt = new JLabel("提示問題", JLabel.CENTER);user_ques_txt.setSize(60, 20);user_ques_txt.setLocation(10, 220);user_ans_txt = new JLabel("問題答案", JLabel.CENTER);user_ans_txt.setSize(60, 20);user_ans_txt.setLocation(10, 255);user_pwd_txt = new JLabel("重置密碼", JLabel.CENTER);user_pwd_txt.setSize(60, 20);user_pwd_txt.setLocation(10, 290);user_name = new JTextField();user_name.setSize(100, 30);user_name.setLocation(80, 185);user_ques = new JLabel("點擊查詢后顯示", JLabel.CENTER);user_ques.setSize(100, 30);user_ques.setLocation(80, 220);user_ans = new JTextField();user_ans.setSize(100, 30);user_ans.setLocation(80, 255);user_pwd = new JTextField();user_pwd.setSize(100, 30);user_pwd.setLocation(80, 290);user_name.addFocusListener(this);user_pwd.addFocusListener(this);user_ans.addFocusListener(this);//下方注冊圖片構造 下 即為 南forget_button_S = new JButton();ImageIcon conform_register_image = new ImageIcon("D:/image/conform_forget_image.png");conform_register_image.setImage(conform_register_image.getImage().getScaledInstance(220, 32, Image.SCALE_DEFAULT));forget_button_S.setIcon(conform_register_image);forget_button_S.setBorderPainted(false);forget_button_S.setBorder(null);forget_button_S.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));forget_button_S.setSize(220, 32);forget_button_S.setLocation(15, 330);forget_button_S.addActionListener(this); //產生事件響應用戶行為}public void actionPerformed(ActionEvent e) {if(e.getSource() == submit_button) {String username = user_name.getText().trim();if("".equals(username) || username == null) {JOptionPane.showMessageDialog(null, "請輸入帳號!!");return;} else {}}if (e.getSource() == forget_button_S) {if(user_name == null ) {JOptionPane.showMessageDialog(null, "請輸入正確賬號并點擊查詢"); return;} String newpwd = user_pwd.getText();if(newpwd == null || "".equals(newpwd)) {JOptionPane.showMessageDialog(null, "請輸入新密碼"); return;}String userans = user_ans.getText();if(userans == null || "".equals(userans)) {JOptionPane.showMessageDialog(null, "請輸入答案");return;}}}//鼠標的點擊或移動之類的用focuslistener 這里不知道為啥沒變色 (哭@Overridepublic void focusGained(FocusEvent e) {//處理賬號輸入框if(e.getSource() == user_name){user_name.setForeground(Color.BLACK);}//處理密碼輸入框if(e.getSource() == user_pwd){user_pwd.setForeground(Color.BLACK);}//處理問題輸入框if(e.getSource() == user_ques){//user_ques.setForeground(Color.BLACK);}//處理答案輸入框if(e.getSource() == user_ans){user_ans.setForeground(Color.BLACK);}}@Overridepublic void focusLost(FocusEvent e) {//處理賬號輸入框if(e.getSource() == user_name){user_name.setForeground(Color.gray);}//處理密碼輸入框if(e.getSource() == user_pwd){user_pwd.setForeground(Color.gray);}//處理問題輸入框if(e.getSource() == user_ques){//user_ques.setForeground(Color.gray);}//處理答案輸入框if(e.getSource() == user_ans){user_ans.setForeground(Color.gray);}}}JDBC模塊
以上仿QQ實現了QQ的登錄功能,但是對于登錄只做了簡單的是否為空的校驗,并沒有使用數據庫進行查詢,可以通過以下方式創建并使用數據庫進行增刪查改:
創建數據庫,并創建User表
create database MyQQ;use MyQQ;create table user(id int primary key auto_increment,username varchar(20),password varchar(20),question varchar(100),answer varchar(100) );INSERT INTO `USER` VALUES(null,'10001','123456','csdnJava哪家強','每天都要努力的小頹廢');將驅動jar包導入項目(jar包地址在軟件地址 的mysql目錄):
JDBC操作代碼如下:
以上僅演示了簡單的JDBC操作,由于篇幅有限,這里暫不介紹如何防登錄注入、JDBC工具類的提取以及數據庫連接池,后續再進行介紹。
需要注意以上代碼中的圖片路徑使用的是絕對路徑,大家可以根據自己需要進行替換,代碼已上傳至Gitee,如果文章知識點有錯誤的地方,請指正!大家一起學習,一起進步,謝謝!
總結
以上是生活随笔為你收集整理的JAVA实现QQ登录、注册、修改密码等功能(美化版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FFmpeg使用教程
- 下一篇: CRC校验算法的Verilog实现