服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - java GUI实现ATM机系统(3.0版)

java GUI实现ATM机系统(3.0版)

2021-08-27 10:45点丶错了。。 Java教程

这篇文章主要为大家详细介绍了java GUI实现ATM机系统(3.0版),文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

写个小项目了解一下GUI。用java GUI实现银行ATM自动取款机,实现登录界面、登录成功界面、各个操作功能实现界面。

用java GUI实现一个ATM机系统(3.0版)

设计思路

设计两个包(bank包,atmJFrame包)

1、bank包:

(1)、ATM类:实现用户各种操作;
(2)、Data类:从user文件中获取所有用户信息,并返回要找的用户,再将修改完之后的用户信息写入user文件中;
(3)、user文件储存所有用户信息。

2、atmJFrame包:

(1)、MyJFrame类:自己创建的界面父类;
(2)、LoginJFrame:登录界面;
(3)、WorkingJFrame:登录成功后显示的功能界面;
(4)、CentreJFrame:中间窗口,存钱、取钱、转账、修改密码界面的父类;
(5)、QuMoneyJFrame:取钱界面;
(6)、CunMoneyJFrame:存钱界面;
(7)、GiveMoneyJFrame:转账界面;
(8)、ChangePasswordJFrame:修改密码界面。

源码

bank包

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package bank;
 
//ATM类
public class ATM {
 //有一个类操作数据的类
 private Data data = new Data();
 //ATM机里的数据
 private String userName;//用户账号且唯一
 private String userPassword;//用户密码
 private double userMoney;//用户账户里的钱
 private String user;//使用该台ATM机的用户全部信息
 private String antherUser;//被转账用户
 
 //登录方法
 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;//获取被转账账户所有信息
  b = true;
 }
 return b;
 }
 //进行转账
 public void giveMoney(Double money1){
 String[] str1 = antherUser.split("\\*");//分割
 Double x = Double.parseDouble(str1[2]);//获取被转账账户余额
 x = x + money1;
 userMoney = userMoney - money1;
 antherUser = changeUser(str1[0], str1[1], x);//改变被转账账户信息
 data.saveData(antherUser,false);//将用户信息传给Data类保存被转账账户信息
 }
 //修改密码实现
 public void changePassword(String newPassword){
 userPassword = newPassword;
 }
 //办完业务后修改用户信息
 private String changeUser(String n,String w,Double d){
 String str = n + "*" + w + "*" + d;
 return str;
 }
 //办完所有业务
 public void over(){
 user = changeUser(userName,userPassword,userMoney);
 data.saveData(user,true);
 }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package bank;
 
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
 
//数据类是文件和ATM机之间操作用户信息的桥梁
public class Data {
 //Map储存数据库里所有用户的全部信息
 Map<String,String> userData = new HashMap();
 //返回用户的信息
 private String user;
 
 //创建数据类加载所有用户信息
 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;
 }
 //修改用户数据并储存在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)//判断用户是否操作结束
  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();
  }
  }
 }
 }
}
?
1
2
3
4
5
//user文件
//需要注意文件位置"src\\bank\\user"
李四*234*7500.0
张三*123*13100.0
王五*123*1100.0

atmJFrame包

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package atmJFrame.myJFrame;
 
import bank.ATM;
 
import javax.swing.*;
import java.awt.*;
 
//自己创造的界面的父类
public class MyJFrame extends JFrame {
 //设置字体供子类使用
 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);
 //给一个静态公共不可改变的ATM对象作为属性,供子类使用
 public static final ATM atm = new ATM();
 //创建窗体
 public MyJFrame(String title){
 super(title);
 //设置窗体不可改变
 setResizable(false);
 //设置窗体大小
 setSize(600,600);
 //设置窗体居中
 setLocationRelativeTo(null);
 }
 //无参构造,创建无标题窗体
 public MyJFrame(){
 this("");
 }
 //设置弹窗方法供子类使用(传入字符串并显示出)
 protected void showMessageDialog(String str){
 JOptionPane.showMessageDialog(this,str);
 }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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机");
 //设置窗体可关闭
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 //设置组件
 init();
 //界面可视化
 setVisible(true);
 }
 //初始化界面
 private void init(){
 //创建面板对象,并定义为空布局
 JPanel jp = new JPanel(null);
 //添加标签
 JLabel jl1 = new JLabel("账号:");
 JLabel jl2 = new JLabel("密码:");
 //设置标签字体
 jl1.setFont(FONT_SIZE_20);
 jl2.setFont(FONT_SIZE_20);
 //设置标签在面板中的位置
 jl1.setBounds(100,100,70,70);
 jl2.setBounds(100,250,70,70);
 //添加文本框
 JTextField jtf = new JTextField(20);
 //添加密码文本框
 JPasswordField jpf = new JPasswordField(20);
 //设置文本框位置
 jtf.setBounds(200,115,200,40);
 jpf.setBounds(200,265,200,40);
 //添加按钮
 JButton jb = new JButton("登录");
 //设置按钮文字大小
 jb.setFont(FONT_SIZE_20);
 //设置按钮位置及大小
 jb.setBounds(250,400,100,50);
 //设置面板背景颜色
 jp.setBackground(Color.YELLOW);
 //内部类进行事件处理
 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();//关闭登录界面
   //打开功能界面
   new WorkingJFrame();
  }
  else
   showMessageDialog("账号或密码错误");//调用父类弹窗方法
  }
 });
 //添加组件
 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();//先创建登录界面
 }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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(){
 //设置第一个面板对象
 JPanel jp1 = new JPanel();
 //创建标签,将标签添加到第一个面板上
 JLabel jb = new JLabel("请选择要进行的操作:");
 jb.setFont(FONT_SIZE_25);//设置标签字体大小
 jp1.add(jb);
 jp1.setBackground(Color.CYAN);
 //将第一个面板添加到窗体上方(JFrame窗体是边界布局)
 add(jp1, BorderLayout.NORTH);
 
 //创建第二个面板对象(空布局,自己设置按钮位置及大小),然后将按钮添加
 JPanel jp2 = new JPanel(null);
 //字符串数组存储各个按钮名字,然后循环设置按钮名字
 String[] str = {"1、余额查询","2、取钱","3、存钱","4、转账","5、修改密码","6、退出系统"};
 //int二维数组储存各个按钮位置及大小信息,循环设置
 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]);//创建按钮
  jButton.setFont(FONT_SIZE_20);//设置按钮字体大小
  jButton.setBounds(xy[i][0],xy[i][1],xy[i][2],xy[i][3]);//设置按钮位置及大小
  jButton.addActionListener(listener);//按钮注册监听器
  jp2.add(jButton);//将按钮添加
 }
 //设置jp2背景颜色
 jp2.setBackground(Color.GRAY);
 //将第二个面板添加到窗体(JFrame窗体中间)
 add(jp2);
 }
 //创建事件监听器
 private ActionListener listener = new ActionListener() {
 @Override
 public void actionPerformed(ActionEvent e) {
  String actionCommand = e.getActionCommand();//获取按钮上的字
  //switch选择功能,且每次功能结束回到该界面,关闭已操作完的功能界面
  switch(actionCommand){
  case "1、余额查询":
   getMoney();
   break;
  case "2、取钱":
   quMoney();
   break;
  case "3、存钱":
   cunMoney();
   break;
  case "4、转账":
   giveMoney();
   break;
  case "5、修改密码":
   changePassword();
   break;
  case "6、退出系统":
   over();
   break;
  }
 }
 };
 //查询余额功能
 private void getMoney(){
 showMessageDialog("您的账户余额为:" + atm.getMoney1());//调用父类方法弹窗
 }
 //取钱功能
 private void quMoney(){
 new QuMoneyJFrame();//创建取钱界面
 dispose();//关闭该界面
 }
 //存钱功能
 private void cunMoney(){
 new CunMoneyJFrame();
 dispose();
 }
 //转账功能
 private void giveMoney(){
 new GiveMoneyJFrame();
 dispose();
 }
 //修改密码功能
 private void changePassword(){
 new ChangePasswordJFrame();
 dispose();
 }
 //退出系统功能
 private void over(){
 atm.over();//调用方法操作文件
 dispose();
 }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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;
 
//中间窗口,存钱、取钱、转账、修改密码界面的父类
public class CentreJFrame extends MyJFrame {
 //空布局面板,自己设置组件位置及大小
 protected JPanel jp = new JPanel(null);
 //输入金额标签
 protected JLabel jl = new JLabel("请输入金额:");
 //输入金额文件框
 protected JTextField jtf = new JTextField(20);
 //确认、取消按钮
 protected JButton jb1 = new JButton("确认");
 protected JButton jb2 = new JButton("取消");
 
 //转账时转账账号标签
 protected JLabel jLabel = new JLabel("请输入转账账号:");
 //转账时转账账号文本框
 protected JTextField jTextField = new JTextField(20);
 
 //修改密码时新密码标签
 protected JLabel jLabelCP = new JLabel("请输入新密码(只能为数字):");
 //修改密码时新密码文本框
 protected JTextField jTextFieldCP = new JTextField(20);
 
 //提醒用户输入金额为100的倍数
 private JLabel jle = new JLabel("( 提示:只能输入100的倍数 )");
 
 public CentreJFrame(String str){
 super(str);
 //判断要进行的操作
 if(str.equals("转账"))
  init1();
 else if(str.equals("修改密码"))
  init2();
 else
  init();
 one();//最后调用共有
 }
 //取钱和取钱特有组件
 private void init(){
 //输入金额标签,设置字体,位置及大小
 jl.setFont(FONT_SIZE_25);
 jl.setBounds(100,100,200,100);
 //输入金额文本框
 jtf.setBounds(300,250,200,50);
 //添加输入金额标签和输入金额文本框
 jp.add(jl);
 jp.add(jtf);
 setJLE();
 }
 //转账特有组件
 private void init1(){
 init();
 //输入账户标签
 jLabel.setFont(FONT_SIZE_25);
 jLabel.setBounds(100,10,200,40);
 //输入账户文本
 jTextField.setBounds(300,80,200,50);
 //添加输入账户标签和输入账户文本
 jp.add(jLabel);
 jp.add(jTextField);
 }
 //修改密码特有组件
 private void init2(){
 //输入新密码标签
 jLabelCP.setFont(FONT_SIZE_25);
 jLabelCP.setBounds(50,100,400,70);
 //输入新密码文本框
 jTextFieldCP.setBounds(300,215,200,40);
 //添加输入新密码标签和输入新密码文本框
 jp.add(jLabelCP);
 jp.add(jTextFieldCP);
 }
 //共有组件及操作
 private void one(){
 //按钮设置
 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);
 }
 
 //设置提示
 private void setJLE(){
 jle.setFont(FONT_SIZE_10);
 jle.setBounds(100,180,300,50);
 jp.add(jle);
 }
 
 //创建监听器
 private ActionListener listener = new ActionListener() {
 @Override
 public void actionPerformed(ActionEvent e) {//按钮被点击后
  String actionCommand = e.getActionCommand();//获取按钮上的字
  switch(actionCommand){
  case "确认":
   change();
   break;
  case "取消":
   new WorkingJFrame();//创建功能界面
   dispose();//关闭此界面
   break;
  }
 }
 };
 //点击确认按钮执行的操作,子类重写覆盖实现各自功能
 protected void change(){
 }
 
 //正则表达式判断输入是否为数字
 protected boolean isNumber(String str){
 Pattern pattern = Pattern.compile("[0-9]*");
 Matcher isNum = pattern.matcher(str);
 if(!isNum.matches())
  return false;
 return true;
 }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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("");
 }
 
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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("");
 }
 
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package atmJFrame.myJFrame;
 
//转账界面
public class GiveMoneyJFrame extends CentreJFrame {
 public GiveMoneyJFrame(){
 super("转账");
 }
 protected void change(){
 String s = jTextField.getText();
 boolean b = atm.anotherUser(s);
 if(b){
  //获取输入金额
  String s1 = jtf.getText();
  if(isNumber(s1)){//如果输入是数字
  Double money = Double.parseDouble(s1);
  atm.giveMoney(money);
  showMessageDialog("钱已转入\n您的账户余额为:" + atm.getMoney1());
  }
  else
  showMessageDialog("您输入有误" );
 }
 else
  showMessageDialog("您输入有误" );
 new WorkingJFrame();//创建功能界面
 dispose();//关闭此界面
 }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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();//创建功能界面
 dispose();//关闭此界面
 }
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/weixin_46085748/article/details/112490606

延伸 · 阅读

精彩推荐