利用Java GUI 實現一個簡易的用戶管理系統

用戶管理系統功能簡介

本篇將介紹一個模擬的用戶管理系統。用戶能夠將自己的賬號、密碼、姓名、部門存入數據庫(為了簡單起見,這裡用文件來代替)。

該系統由四個界面組成。

1.登錄界面

系統運行,出現登錄界面,如圖所示。

利用Java GUI 實現一個簡易的用戶管理系統

該界面出現在屏幕中間,在這個界面中:

(1)單擊“登錄”按鈕,能夠根據輸入的賬號密碼進行登錄;如果登錄失敗,能夠提示;如果登錄成功,提示登錄成功之後,能到達操作界面

(2)單擊“註冊”按鈕,登錄界面消失,出現註冊界面。

(3)單擊“退出”按鈕,程序退出。

2.註冊界面

註冊界面如圖所示。

利用Java GUI 實現一個簡易的用戶管理系統

在這個界面中:

(1)單擊“註冊”按鈕,能夠根據輸入的賬號、密碼、姓名、部門進行註冊。兩個密碼必須相等,賬號不能重複註冊,部門選項如圖所示。

利用Java GUI 實現一個簡易的用戶管理系統

(2)單擊“登錄”按鈕,註冊界面消失,出現登錄界面。

(3)單擊“退出”按鈕,程序退出。

3.操作界面

用戶登錄成功之後,出現操作界面,該界面效果如圖所示。

利用Java GUI 實現一個簡易的用戶管理系統

在這個界面中:

(1)標題欄顯示當前登錄的賬號。

(2)單擊“顯示詳細信息”按鈕,顯示用戶的詳細信息。如圖所示。

利用Java GUI 實現一個簡易的用戶管理系統

(3)單擊“退出”按鈕,程序退出。

(4)單擊“修改個人資料”按鈕,顯示修改個人資料的界面。

4.修改個人資料界面

該界面如圖所示。

利用Java GUI 實現一個簡易的用戶管理系統

所有內容均初始化填入相應的控件。賬號不可修改。

在這個界面中:

(1)單擊“修改”按鈕,能夠修改用戶信息。

(2)單擊“關閉”按鈕,能夠關掉該界面。

關鍵技術

1.如何組織界面

在這個項目中,需要用到一下幾個界面:登錄界面,註冊界面,操作界面和修改界面。很明顯,這些界面各自有自己的控件和事件,4個界面應該分4個類,在各個類裡面負責界面的界面元素和事件處理,是比較好的方法。

設計出來的類如下:

1.LoginFrame:登錄界面。

2.ResgisterFrame:註冊界面。

3.OperationFrame:操作界面。

4.ModifyFrame:修改界面。

2.如何訪問文件

該項目在幾個界面類中都用到了文件操作,如果將文件操作的代碼分散在多個界面類中,維護性較差。因此,有必要將文件操作的代碼專門放在一個類中,讓各個界面調用。

數據保存在“cus.inc”中,以“賬號=密碼#姓名#部門”的格式保存,便於Properties類來讀。讀文件類為FileOpe。負責讀文件,將信息保存到文件中。

3.如何保持狀態

將項目劃分為幾個模塊之後,模塊之間的數據傳遞難度增大了。比如,在登錄界面中,登錄成功之後,系統就應該記住該用戶的所有信息;否則到了操作界面,無法知道是誰在登錄,到了修改界面,更無法顯示其詳細信息。

有很多方法可以保存其狀態。這裡採用“靜態變量法”。該方法就是將各個模塊之間需要共享的數據保存在其某給類的靜態變量中。靜態變量一旦賦值,在另一個時刻訪問,仍然是這個值,因此,可以用靜態變量來傳送數據。

設計的類如下:

Conf:內含4個靜態成員。

1.public static String account; //保存登錄用戶的賬號。

2.public static String password; //保存登錄用戶的密碼。

3.public static String name; //保存登錄用戶的姓名。

4.public static String dept; //保存登錄用戶的部門。

4.其他公共功能

在本項目中,界面都要顯示在屏幕中間,因此,可以編寫一段公用代碼完成這個功能。該公用代碼放在GUIUtil類中。

ps:還有一些資源文件事先要建好。比如,登錄界面上的歡迎圖片,數據文件cus.inc等

代碼編寫

1.首先是Conf類,比較簡單:

package UserManageSystem;public class Conf { public static String account; public static String password; public static String name; public static String dept;}123456789

2.然後是FileOpe類:

package UserManageSystem;import java.io.FileReader;import java.io.PrintStream;import java.util.Properties;import javax.swing.JOptionPane;public class FileOpe { private static String fileName="cus.inc"; private static Properties pps; static { pps=new Properties(); FileReader reader=null; try { reader=new FileReader(fileName); pps.load(reader); } catch (Exception ex) { JOptionPane.showMessageDialog(null,"文件操作異常"); System.exit(0); } finally { try { reader.close(); } catch (Exception ex) {} } } private static void listInfo() { PrintStream ps=null; try { ps=new PrintStream(fileName); pps.list(ps); } catch (Exception ex) { JOptionPane.showMessageDialog(null,"文件操作異常"); System.exit(0); } finally { try { ps.close(); } catch (Exception ex) {} } } public static void getInfoByAccount(String account) { String cusInfo=pps.getProperty(account); if(cusInfo!=null) { String[] infos=cusInfo.split("#"); Conf.account=account; Conf.password=infos[0]; Conf.name=infos[1]; Conf.dept=infos[2]; } } public static void updateCustomer(String account,String password, String name,String dept) { pps.setProperty(account,password+"#"+name+"#"+dept); listInfo(); }}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061

ps:本類中,靜態代碼塊中的代碼負責載入cus.inc中的數據

3.接下來是GUIUtil類:

package UserManageSystem;import java.awt.Component;import java.awt.GraphicsEnvironment;import java.awt.Rectangle;public class GUIUtil { public static void toCenter(Component comp) { GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment(); Rectangle rec=ge.getDefaultScreenDevice().getDefaultConfiguration().getBounds(); comp.setLocation(((int)(rec.getWidth()-comp.getWidth())/2), ((int)(rec.getHeight()-comp.getHeight()))/2); }}123456789101112131415

ps:本類中,toCenter(Component comp)函數傳入的參數不是JFrame,而是其弗雷Component,完全是為了擴大本函數的適用範圍,讓其適用於所有Component子類。

4.登錄界面類:

package UserManageSystem;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.Icon;import javax.swing.JOptionPane;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPasswordField;import javax.swing.JButton;import javax.swing.JTextField;public class LoginFrame extends JFrame implements ActionListener { /****************************定義各控件**************************/ private Icon welcomeIcon=new ImageIcon("welcome.png"); private JLabel lbWelcome=new JLabel(welcomeIcon); private JLabel lbAccount=new JLabel("請您輸入賬號"); private JTextField tfAccount=new JTextField(10); private JLabel lbPassword=new JLabel("請您輸入密碼"); private JPasswordField pfPassword=new JPasswordField(10); private JButton btLogin=new JButton("登錄"); private JButton btRegister=new JButton("註冊"); private JButton btExit=new JButton("退出"); public LoginFrame() { /**********************界面初始化*****************************/ super("登錄"); this.setLayout(new FlowLayout()); this.add(lbWelcome); this.add(lbAccount); this.add(tfAccount); this.add(lbPassword); this.add(pfPassword); this.add(btLogin); this.add(btRegister); this.add(btExit); this.setSize(240,180); GUIUtil.toCenter(this); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); this.setVisible(true); /*****************************增加監聽************************/ btLogin.addActionListener(this); btRegister.addActionListener(this); btExit.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==btLogin) { String account=tfAccount.getText(); String password=new String(pfPassword.getPassword()); FileOpe.getInfoByAccount(account); if(Conf.account==null||!Conf.password.equals(password)) { JOptionPane.showMessageDialog(this,"登錄失敗"); return; } JOptionPane.showMessageDialog(this,"登錄成功"); this.dispose(); new OperationFrame(); } else if(e.getSource()==btRegister) { this.dispose(); new RegisterFrame(); } else { JOptionPane.showMessageDialog(this,"謝謝光臨"); System.exit(0); } }}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

ps:本類中this.dispose();表示讓本界面消失,釋放內存,但是程序不結束。System.exit(0);表示整個程序退出。

5.註冊界面類:

package UserManageSystem;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPasswordField;import javax.swing.JTextField;public class RegisterFrame extends JFrame implements ActionListener { /**********************定義各控件********************************/ private JLabel lbAccount=new JLabel("請您輸入賬號"); private JTextField tfAccount=new JTextField(10); private JLabel lbPassword=new JLabel("請您輸入密碼"); private JPasswordField pfPassword=new JPasswordField(10); private JLabel lbPassword2=new JLabel("輸入確認密碼"); private JPasswordField pfPassword2=new JPasswordField(10); private JLabel lbName=new JLabel("請您輸入姓名"); private JTextField tfName=new JTextField(10); private JLabel lbDept=new JLabel("請您選擇部門"); private JComboBox cbDept=new JComboBox(); private JButton btRegister=new JButton("註冊"); private JButton btLogin=new JButton("登錄"); private JButton btExit=new JButton("退出"); public RegisterFrame() { /******************界面初始化********************/ super("註冊"); this.setLayout(new FlowLayout()); this.add(lbAccount); this.add(tfAccount); this.add(lbPassword); this.add(pfPassword); this.add(lbPassword2); this.add(pfPassword2); this.add(lbName); this.add(tfName); this.add(lbDept); this.add(cbDept); cbDept.addItem("財務部"); cbDept.addItem("行政部"); cbDept.addItem("客服服務部"); cbDept.addItem("銷售部"); this.add(btRegister); this.add(btLogin); this.add(btExit); this.setSize(240,220); GUIUtil.toCenter(this); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); this.setVisible(true); /****************************增加監聽***********************/ btLogin.addActionListener(this); btRegister.addActionListener(this); btExit.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==btRegister) { String password1=new String(pfPassword.getPassword()); String password2=new String(pfPassword2.getPassword()); if(!password1.equals(password2)) { JOptionPane.showMessageDialog(this,"兩個密碼不相同"); return; } String account=tfAccount.getText(); FileOpe.getInfoByAccount(account); if(Conf.account!=null) { JOptionPane.showMessageDialog(this,"用戶已經註冊"); return; } String name=tfName.getText(); String dept=(String)cbDept.getSelectedItem(); FileOpe.updateCustomer(account,password1,name,dept); JOptionPane.showMessageDialog(this,"註冊成功"); } else if(e.getSource()==btLogin) { this.dispose(); new LoginFrame(); } else { JOptionPane.showMessageDialog(this,"謝謝光臨"); System.exit(0); } }}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889

6.操作界面類:

package UserManageSystem;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JFrame;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JOptionPane;public class OperationFrame extends JFrame implements ActionListener { /************************定義各控件******************************/ private String welcomMsg="選擇如下操作:"; private JLabel lblWelcome=new JLabel(welcomMsg); private JButton btQuery=new JButton("顯示詳細信息"); private JButton btModify=new JButton("修改個人資料"); private JButton btExit=new JButton("退出"); public OperationFrame() { /****************************界面初始化************************/ super("當前登錄: "+Conf.account); this.setLayout(new GridLayout(4,1)); this.add(lblWelcome); this.add(btQuery); this.add(btModify); this.add(btExit); this.setSize(300,250); GUIUtil.toCenter(this); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); this.setVisible(true); /**********************增加監聽*******************************/ btQuery.addActionListener(this); btModify.addActionListener(this); btExit.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==btQuery) { String message="您的詳細資料為:\n"; message+="賬號:"+Conf.account+"\n"; message+="姓名:"+Conf.name+"\n"; message+="部門:"+Conf.dept+"\n"; JOptionPane.showMessageDialog(this,message); } else if(e.getSource()==btModify) { new ModifyDialog(this); } else { JOptionPane.showMessageDialog(this,"謝謝光臨"); System.exit(0); } }}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253

7.最後是ModifyDialog類,注意ModifyDialog是一個模態對話框。

package UserManageSystem;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JDialog;import javax.swing.JOptionPane;import javax.swing.JPasswordField;import javax.swing.JTextField;public class ModifyDialog extends JDialog implements ActionListener { /*******************************定義各控件**************************/ private JLabel lbMsg=new JLabel("您的賬號為:"); private JLabel lbAccount=new JLabel(Conf.account); private JLabel lbPassword=new JLabel("請您輸入密碼"); private JPasswordField pfPassword=new JPasswordField(Conf.password,10); private JLabel lbPassword2=new JLabel("輸入確認密碼"); private JPasswordField pfPassword2=new JPasswordField(Conf.password,10); private JLabel lbName=new JLabel("請您修改姓名"); private JTextField tfName=new JTextField(Conf.name,10); private JLabel lbDept=new JLabel("請您修改部門"); private JComboBox cbDept=new JComboBox(); private JButton btModify=new JButton("修改"); private JButton btExit=new JButton("關閉"); public ModifyDialog(JFrame frm) { /***********************界面初始化***************************/ super(frm,true); this.setLayout(new GridLayout(6,2)); this.add(lbMsg); this.add(lbAccount); this.add(lbPassword); this.add(pfPassword); this.add(lbPassword2); this.add(pfPassword2); this.add(lbName); this.add(tfName); this.add(lbDept); this.add(cbDept); cbDept.addItem("財務部"); cbDept.addItem("行政部"); cbDept.addItem("客戶服務部"); cbDept.addItem("銷售部"); cbDept.setSelectedItem(Conf.dept); this.add(btModify); this.add(btExit); this.setSize(240,200); GUIUtil.toCenter(this); this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); /*******************增加監聽*******************************/ btModify.addActionListener(this); btExit.addActionListener(this); this.setResizable(false); this.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==btModify) { String password1=new String(pfPassword.getPassword()); String password2=new String(pfPassword2.getPassword()); if(!password1.equals(password2)) { JOptionPane.showMessageDialog(this,"兩個密碼不相同"); return; } String name=tfName.getText(); String dept=(String)cbDept.getSelectedItem(); //將新的值存入靜態變量 Conf.password=password1; Conf.name=name; Conf.dept=dept; FileOpe.updateCustomer(Conf.account,password1,name,dept); JOptionPane.showMessageDialog(this,"修改成功"); } else { this.dispose(); } }}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

8.主函數類,用來調用登錄界面測試程序:

package UserManageSystem;public class Main { public static void main(String[] args) { new LoginFrame(); }}12345678

運行該類,則可以出現登錄界面。

利用Java GUI 實現一個簡易的用戶管理系統


分享到:


相關文章: