java GUI實現(xiàn)ATM機系統(tǒng)(3.0版)
寫個小項目了解一下GUI。用java GUI實現(xiàn)銀行ATM自動取款機,實現(xiàn)登錄界面、登錄成功界面、各個操作功能實現(xiàn)界面。
用java GUI實現(xiàn)一個ATM機系統(tǒng)(3.0版)
設(shè)計思路
設(shè)計兩個包(bank包,atmJFrame包)
1、bank包:
(1)、ATM類:實現(xiàn)用戶各種操作;
(2)、Data類:從user文件中獲取所有用戶信息,并返回要找的用戶,再將修改完之后的用戶信息寫入user文件中;
(3)、user文件儲存所有用戶信息。
2、atmJFrame包:
(1)、MyJFrame類:自己創(chuàng)建的界面父類;
(2)、LoginJFrame:登錄界面;
(3)、WorkingJFrame:登錄成功后顯示的功能界面;
(4)、CentreJFrame:中間窗口,存錢、取錢、轉(zhuǎn)賬、修改密碼界面的父類;
(5)、QuMoneyJFrame:取錢界面;
(6)、CunMoneyJFrame:存錢界面;
(7)、GiveMoneyJFrame:轉(zhuǎn)賬界面;
(8)、ChangePasswordJFrame:修改密碼界面。
源碼
bank包
package bank;
//ATM類
public class ATM {
//有一個類操作數(shù)據(jù)的類
private Data data = new Data();
//ATM機里的數(shù)據(jù)
private String userName;//用戶賬號且唯一
private String userPassword;//用戶密碼
private double userMoney;//用戶賬戶里的錢
private String user;//使用該臺ATM機的用戶全部信息
private String antherUser;//被轉(zhuǎn)賬用戶
//登錄方法
public boolean login(String userNameString,String userPassword1){
boolean b= false;
String x = data.backUser(userNameString);
//判斷賬戶是否存在
if(!x.equals("null")){
user = x;//獲取用戶所有信息
String[] str = user.split("\\*");//將用戶信息分割
userName = str[0];//用戶名
userPassword = str[1];//用戶密碼
userMoney = Double.parseDouble(str[2]);//用戶余額
//密碼正確
if(userPassword.equals(userPassword1))
b = true;
}
return b;
}
//獲取賬戶余額
public Double getMoney1(){
return userMoney;
}
//存錢
public boolean saveMoney(Double money1){
boolean b = false;
if(money1%100 == 0) { //如果存的錢正確
userMoney = userMoney + money1;//存上
b = true;
}
return b;
}
//取錢
public boolean quMoney(Double money1){
boolean b = false;
if(money1%100 == 0 && money1 <= userMoney){
userMoney = userMoney - money1;
b = true;
}
return b;
}
//只判斷用戶賬戶是否存在
public boolean anotherUser(String userName1){
boolean b = false;
String inUserName = userName1;
String str = data.backUser(inUserName);
//如果該賬戶存在
if(!str.equals("null")) {
antherUser = str;//獲取被轉(zhuǎn)賬賬戶所有信息
b = true;
}
return b;
}
//進行轉(zhuǎn)賬
public void giveMoney(Double money1){
String[] str1 = antherUser.split("\\*");//分割
Double x = Double.parseDouble(str1[2]);//獲取被轉(zhuǎn)賬賬戶余額
x = x + money1;
userMoney = userMoney - money1;
antherUser = changeUser(str1[0], str1[1], x);//改變被轉(zhuǎn)賬賬戶信息
data.saveData(antherUser,false);//將用戶信息傳給Data類保存被轉(zhuǎn)賬賬戶信息
}
//修改密碼實現(xiàn)
public void changePassword(String newPassword){
userPassword = newPassword;
}
//辦完業(yè)務(wù)后修改用戶信息
private String changeUser(String n,String w,Double d){
String str = n + "*" + w + "*" + d;
return str;
}
//辦完所有業(yè)務(wù)
public void over(){
user = changeUser(userName,userPassword,userMoney);
data.saveData(user,true);
}
}
package bank;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
//數(shù)據(jù)類是文件和ATM機之間操作用戶信息的橋梁
public class Data {
//Map儲存數(shù)據(jù)庫里所有用戶的全部信息
Map<String,String> userData = new HashMap();
//返回用戶的信息
private String user;
//創(chuàng)建數(shù)據(jù)類加載所有用戶信息
public Data(){
getUsers();
}
private void getUsers(){
String str;
String[] string;
File file = new File("src\\bank\\user");
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try{
fileReader = new FileReader(file);
bufferedReader = new BufferedReader(fileReader);
while((str = bufferedReader.readLine())!=null){
string = str.split("\\*",2);
userData.put(string[0],string[1]);
}
}catch(Exception e){
e.printStackTrace();
if((fileReader!=null)&&(bufferedReader!=null)){
try {
bufferedReader.close();
fileReader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
//告訴用戶名,如果找到返回該用戶所有信息,沒找到返回null
public String backUser(String userName){
String str = "null";
if(userData.containsKey(userName))
str = userName + "*" + userData.get(userName);
user = str;
return user;
}
//修改用戶數(shù)據(jù)并儲存在userData圖里
public void saveData(String user,boolean aBoolean){
String[] string = user.split("\\*",2);
userData.remove(string[0]);
userData.put(string[0],string[1]);
if(aBoolean)//判斷用戶是否操作結(jié)束
changeUser();
}
//用戶操作完,將userData里所有的用戶再寫入文件里
private void changeUser(){
String str,string="";
Set<String> keys = userData.keySet();
for(String key : keys){
str = key + "*" + userData.get(key);
string = string + str + "\n";
}
File file = new File("src\\bank\\user");
FileWriter out = null;
try {
out = new FileWriter(file);
out.write(string);
out.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(out != null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}//user文件 //需要注意文件位置"src\\bank\\user" 李四*234*7500.0 張三*123*13100.0 王五*123*1100.0
atmJFrame包
package atmJFrame.myJFrame;
import bank.ATM;
import javax.swing.*;
import java.awt.*;
//自己創(chuàng)造的界面的父類
public class MyJFrame extends JFrame {
//設(shè)置字體供子類使用
public static final Font FONT_SIZE_10 = new Font("宋體",Font.PLAIN,18);
public static final Font FONT_SIZE_20 = new Font("宋體",Font.PLAIN,20);
public static final Font FONT_SIZE_25 = new Font("宋體",Font.PLAIN,25);
//給一個靜態(tài)公共不可改變的ATM對象作為屬性,供子類使用
public static final ATM atm = new ATM();
//創(chuàng)建窗體
public MyJFrame(String title){
super(title);
//設(shè)置窗體不可改變
setResizable(false);
//設(shè)置窗體大小
setSize(600,600);
//設(shè)置窗體居中
setLocationRelativeTo(null);
}
//無參構(gòu)造,創(chuàng)建無標(biāo)題窗體
public MyJFrame(){
this("");
}
//設(shè)置彈窗方法供子類使用(傳入字符串并顯示出)
protected void showMessageDialog(String str){
JOptionPane.showMessageDialog(this,str);
}
}
package atmJFrame.myJFrame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//登錄界面繼承MyJFrame
public class LoginJFrame extends MyJFrame {
public LoginJFrame(){
super("歡迎使用ATM機");
//設(shè)置窗體可關(guān)閉
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//設(shè)置組件
init();
//界面可視化
setVisible(true);
}
//初始化界面
private void init(){
//創(chuàng)建面板對象,并定義為空布局
JPanel jp = new JPanel(null);
//添加標(biāo)簽
JLabel jl1 = new JLabel("賬號:");
JLabel jl2 = new JLabel("密碼:");
//設(shè)置標(biāo)簽字體
jl1.setFont(FONT_SIZE_20);
jl2.setFont(FONT_SIZE_20);
//設(shè)置標(biāo)簽在面板中的位置
jl1.setBounds(100,100,70,70);
jl2.setBounds(100,250,70,70);
//添加文本框
JTextField jtf = new JTextField(20);
//添加密碼文本框
JPasswordField jpf = new JPasswordField(20);
//設(shè)置文本框位置
jtf.setBounds(200,115,200,40);
jpf.setBounds(200,265,200,40);
//添加按鈕
JButton jb = new JButton("登錄");
//設(shè)置按鈕文字大小
jb.setFont(FONT_SIZE_20);
//設(shè)置按鈕位置及大小
jb.setBounds(250,400,100,50);
//設(shè)置面板背景顏色
jp.setBackground(Color.YELLOW);
//內(nèi)部類進行事件處理
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//獲取輸入的賬號和密碼
String userName = jtf.getText();
String userPassword = new String(jpf.getPassword());
//驗證是否正確
boolean aBoolean = atm.login(userName,userPassword);
if(aBoolean){
//登錄成功
dispose();//關(guān)閉登錄界面
//打開功能界面
new WorkingJFrame();
}
else
showMessageDialog("賬號或密碼錯誤");//調(diào)用父類彈窗方法
}
});
//添加組件
jp.add(jl1);
jp.add(jtf);
jp.add(jl2);
jp.add(jpf);
jp.add(jb);
//窗體添加面板
add(jp);
}
public static void main(String[] args) {
new LoginJFrame();//先創(chuàng)建登錄界面
}
}
package atmJFrame.myJFrame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//功能界面
public class WorkingJFrame extends MyJFrame {
public WorkingJFrame(){
super("功能界面");
init();
setVisible(true);
}
//初始化功能界面
private void init(){
//設(shè)置第一個面板對象
JPanel jp1 = new JPanel();
//創(chuàng)建標(biāo)簽,將標(biāo)簽添加到第一個面板上
JLabel jb = new JLabel("請選擇要進行的操作:");
jb.setFont(FONT_SIZE_25);//設(shè)置標(biāo)簽字體大小
jp1.add(jb);
jp1.setBackground(Color.CYAN);
//將第一個面板添加到窗體上方(JFrame窗體是邊界布局)
add(jp1, BorderLayout.NORTH);
//創(chuàng)建第二個面板對象(空布局,自己設(shè)置按鈕位置及大?。?,然后將按鈕添加
JPanel jp2 = new JPanel(null);
//字符串?dāng)?shù)組存儲各個按鈕名字,然后循環(huán)設(shè)置按鈕名字
String[] str = {"1、余額查詢","2、取錢","3、存錢","4、轉(zhuǎn)賬","5、修改密碼","6、退出系統(tǒng)"};
//int二維數(shù)組儲存各個按鈕位置及大小信息,循環(huán)設(shè)置
int[][] xy = new int[][]{{50,100,200,50},{350,100,200,50},{50,200,200,50},{350,200,200,50},{50,300,200,50},{350,300,200,50}};
for(int i = 0;i < str.length;i ++){
JButton jButton = new JButton(str[i]);//創(chuàng)建按鈕
jButton.setFont(FONT_SIZE_20);//設(shè)置按鈕字體大小
jButton.setBounds(xy[i][0],xy[i][1],xy[i][2],xy[i][3]);//設(shè)置按鈕位置及大小
jButton.addActionListener(listener);//按鈕注冊監(jiān)聽器
jp2.add(jButton);//將按鈕添加
}
//設(shè)置jp2背景顏色
jp2.setBackground(Color.GRAY);
//將第二個面板添加到窗體(JFrame窗體中間)
add(jp2);
}
//創(chuàng)建事件監(jiān)聽器
private ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String actionCommand = e.getActionCommand();//獲取按鈕上的字
//switch選擇功能,且每次功能結(jié)束回到該界面,關(guān)閉已操作完的功能界面
switch(actionCommand){
case "1、余額查詢":
getMoney();
break;
case "2、取錢":
quMoney();
break;
case "3、存錢":
cunMoney();
break;
case "4、轉(zhuǎn)賬":
giveMoney();
break;
case "5、修改密碼":
changePassword();
break;
case "6、退出系統(tǒng)":
over();
break;
}
}
};
//查詢余額功能
private void getMoney(){
showMessageDialog("您的賬戶余額為:" + atm.getMoney1());//調(diào)用父類方法彈窗
}
//取錢功能
private void quMoney(){
new QuMoneyJFrame();//創(chuàng)建取錢界面
dispose();//關(guān)閉該界面
}
//存錢功能
private void cunMoney(){
new CunMoneyJFrame();
dispose();
}
//轉(zhuǎn)賬功能
private void giveMoney(){
new GiveMoneyJFrame();
dispose();
}
//修改密碼功能
private void changePassword(){
new ChangePasswordJFrame();
dispose();
}
//退出系統(tǒng)功能
private void over(){
atm.over();//調(diào)用方法操作文件
dispose();
}
}
package atmJFrame.myJFrame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//中間窗口,存錢、取錢、轉(zhuǎn)賬、修改密碼界面的父類
public class CentreJFrame extends MyJFrame {
//空布局面板,自己設(shè)置組件位置及大小
protected JPanel jp = new JPanel(null);
//輸入金額標(biāo)簽
protected JLabel jl = new JLabel("請輸入金額:");
//輸入金額文件框
protected JTextField jtf = new JTextField(20);
//確認(rèn)、取消按鈕
protected JButton jb1 = new JButton("確認(rèn)");
protected JButton jb2 = new JButton("取消");
//轉(zhuǎn)賬時轉(zhuǎn)賬賬號標(biāo)簽
protected JLabel jLabel = new JLabel("請輸入轉(zhuǎn)賬賬號:");
//轉(zhuǎn)賬時轉(zhuǎn)賬賬號文本框
protected JTextField jTextField = new JTextField(20);
//修改密碼時新密碼標(biāo)簽
protected JLabel jLabelCP = new JLabel("請輸入新密碼(只能為數(shù)字):");
//修改密碼時新密碼文本框
protected JTextField jTextFieldCP = new JTextField(20);
//提醒用戶輸入金額為100的倍數(shù)
private JLabel jle = new JLabel("( 提示:只能輸入100的倍數(shù) )");
public CentreJFrame(String str){
super(str);
//判斷要進行的操作
if(str.equals("轉(zhuǎn)賬"))
init1();
else if(str.equals("修改密碼"))
init2();
else
init();
one();//最后調(diào)用共有
}
//取錢和取錢特有組件
private void init(){
//輸入金額標(biāo)簽,設(shè)置字體,位置及大小
jl.setFont(FONT_SIZE_25);
jl.setBounds(100,100,200,100);
//輸入金額文本框
jtf.setBounds(300,250,200,50);
//添加輸入金額標(biāo)簽和輸入金額文本框
jp.add(jl);
jp.add(jtf);
setJLE();
}
//轉(zhuǎn)賬特有組件
private void init1(){
init();
//輸入賬戶標(biāo)簽
jLabel.setFont(FONT_SIZE_25);
jLabel.setBounds(100,10,200,40);
//輸入賬戶文本
jTextField.setBounds(300,80,200,50);
//添加輸入賬戶標(biāo)簽和輸入賬戶文本
jp.add(jLabel);
jp.add(jTextField);
}
//修改密碼特有組件
private void init2(){
//輸入新密碼標(biāo)簽
jLabelCP.setFont(FONT_SIZE_25);
jLabelCP.setBounds(50,100,400,70);
//輸入新密碼文本框
jTextFieldCP.setBounds(300,215,200,40);
//添加輸入新密碼標(biāo)簽和輸入新密碼文本框
jp.add(jLabelCP);
jp.add(jTextFieldCP);
}
//共有組件及操作
private void one(){
//按鈕設(shè)置
jb1.setFont(FONT_SIZE_20);
jb2.setFont(FONT_SIZE_20);
jb1.setBounds(300,350,100,50);
jb2.setBounds(450,350,100,50);
jp.add(jb1);
jp.add(jb2);
jp.setBackground(Color.GREEN);
jb1.addActionListener(listener);
jb2.addActionListener(listener);
//添加到窗體
add(jp);
setVisible(true);
}
//設(shè)置提示
private void setJLE(){
jle.setFont(FONT_SIZE_10);
jle.setBounds(100,180,300,50);
jp.add(jle);
}
//創(chuàng)建監(jiān)聽器
private ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {//按鈕被點擊后
String actionCommand = e.getActionCommand();//獲取按鈕上的字
switch(actionCommand){
case "確認(rèn)":
change();
break;
case "取消":
new WorkingJFrame();//創(chuàng)建功能界面
dispose();//關(guān)閉此界面
break;
}
}
};
//點擊確認(rèn)按鈕執(zhí)行的操作,子類重寫覆蓋實現(xiàn)各自功能
protected void change(){
}
//正則表達(dá)式判斷輸入是否為數(shù)字
protected boolean isNumber(String str){
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
if(!isNum.matches())
return false;
return true;
}
}
package atmJFrame.myJFrame;
//取錢界面
public class QuMoneyJFrame extends CentreJFrame {
public QuMoneyJFrame(){
super("取錢");
}
protected void change(){
String s = jtf.getText();
if(isNumber(s)){
Double money = Double.parseDouble(s);
boolean b = atm.quMoney(money);
if(b){
showMessageDialog("請收好您的錢\n您的賬戶余額為:" + atm.getMoney1());
}
else
showMessageDialog("您輸入有誤" );
}
else
showMessageDialog("您輸入有誤" );
jtf.setText("");
}
}
package atmJFrame.myJFrame;
//存錢界面
public class CunMoneyJFrame extends CentreJFrame {
public CunMoneyJFrame(){
super("存錢");
}
protected void change(){
String s = jtf.getText();
if(isNumber(s)){
Double money = Double.parseDouble(s);
boolean b = atm.saveMoney(money);
if(b)
showMessageDialog("您的錢錢已存入\n您的賬戶余額為:" + atm.getMoney1());
else
showMessageDialog("您輸入有誤" );
}
else
showMessageDialog("您輸入有誤" );
jtf.setText("");
}
}
package atmJFrame.myJFrame;
//轉(zhuǎn)賬界面
public class GiveMoneyJFrame extends CentreJFrame {
public GiveMoneyJFrame(){
super("轉(zhuǎn)賬");
}
protected void change(){
String s = jTextField.getText();
boolean b = atm.anotherUser(s);
if(b){
//獲取輸入金額
String s1 = jtf.getText();
if(isNumber(s1)){//如果輸入是數(shù)字
Double money = Double.parseDouble(s1);
atm.giveMoney(money);
showMessageDialog("錢已轉(zhuǎn)入\n您的賬戶余額為:" + atm.getMoney1());
}
else
showMessageDialog("您輸入有誤" );
}
else
showMessageDialog("您輸入有誤" );
new WorkingJFrame();//創(chuàng)建功能界面
dispose();//關(guān)閉此界面
}
}
package atmJFrame.myJFrame;
//修改密碼界面
public class ChangePasswordJFrame extends CentreJFrame{
public ChangePasswordJFrame(){
super("修改密碼");
}
protected void change(){
String s = jTextFieldCP.getText();
if(isNumber(s)){
atm.changePassword(s);
showMessageDialog("密碼修改成功");
}
else
showMessageDialog("您輸入有誤" );
new WorkingJFrame();//創(chuàng)建功能界面
dispose();//關(guān)閉此界面
}
}以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring security基于數(shù)據(jù)庫中賬戶密碼認(rèn)證
這篇文章主要介紹了Spring security基于數(shù)據(jù)庫中賬戶密碼認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
SpringBoot集成ShedLock實現(xiàn)分布式定時任務(wù)流程詳解
ShedLock是一個鎖,官方解釋是他永遠(yuǎn)只是一個鎖,并非是一個分布式任務(wù)調(diào)度器。一般shedLock被使用的場景是,你有個任務(wù),你只希望他在單個節(jié)點執(zhí)行,而不希望他并行執(zhí)行,而且這個任務(wù)是支持重復(fù)執(zhí)行的2023-02-02
解決springboot啟動失敗的問題('hibernate.dialect'?not?set)
這篇文章主要介紹了解決springboot啟動失敗的問題('hibernate.dialect'?not?set),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12

