日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA实现QQ登录、注册、修改密码等功能(美化版)

發布時間:2023/12/31 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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操作代碼如下:

import com.mysql.jdbc.Driver;import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement;public class Test {public static void main(String[] args) throws Exception{// 需求:查詢所有的用戶, 輸出到控制臺// 分析:// 1.創建項目,拷貝驅動jar包到模塊下,并添加到classpath路徑中// 2.注冊驅動DriverManager.registerDriver(new Driver());// 3.獲得連接String url = "jdbc:mysql://localhost:3306/db_mybatis";String username = "root";String password = "root";Connection connection = DriverManager.getConnection(url,username,password);// 4.創建執行sql的對象Statement statement = connection.createStatement();// 5.執行sql語句,處理結果String sql = "select * from user";ResultSet resultSet = statement.executeQuery(sql);while (resultSet.next()) {// 取出來//System.out.print(resultSet.getObject("id")+" ");//System.out.print(resultSet.getObject("username")+" ");//System.out.print(resultSet.getObject("password")+" ");//System.out.println(resultSet.getObject("question")+" ");//System.out.println(resultSet.getObject("answer"));System.out.print(resultSet.getObject(1)+" ");System.out.print(resultSet.getObject(2)+" ");System.out.print(resultSet.getObject(3)+" ");System.out.println(resultSet.getObject(4)+" ");System.out.println(resultSet.getObject(5));System.out.println("------------------------------------------------");}username = "10001";password = "1234567";// 5.2 判斷用戶名密碼是否正確sql = "select * from user where username = " + username + " and password =" + password;resultSet = statement.executeQuery(sql);//查詢到了說明不為空,此時登錄成功if(resultSet.next()){System.out.println("登錄成功");}else{System.out.println("登錄失敗");}// 6.釋放資源if (resultSet != null){resultSet.close();}if (statement != null){statement.close();}if (connection != null){connection.close();}} }

以上僅演示了簡單的JDBC操作,由于篇幅有限,這里暫不介紹如何防登錄注入、JDBC工具類的提取以及數據庫連接池,后續再進行介紹。

需要注意以上代碼中的圖片路徑使用的是絕對路徑,大家可以根據自己需要進行替換,代碼已上傳至Gitee,如果文章知識點有錯誤的地方,請指正!大家一起學習,一起進步,謝謝!

總結

以上是生活随笔為你收集整理的JAVA实现QQ登录、注册、修改密码等功能(美化版)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。