java_ATM_GUI
Test 界面:
import java.awt.Menu; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; import java.util.List; import javax.swing.JOptionPane; // JOptionPane 类 方便的弹出要求用户提供值或向其发出消息通知的对话框 import javafx.scene.layout.Pane; // 支持用户界面布局,面板 import jdk.incubator.http.WebSocket.Builder; public class Test{ // 通过静态变量来调用全局 public static List<zhanghu> usersList; // 具体账户(所有) // userslist类型 zhanghu为参数(类) List<zhanghu> 一个容器类泛型 public static zhanghu d_zhanghu; // 登陆的账户 public static File file; // 当前用户的记录文件 public static StringBuilder r_string = new StringBuilder(); // 对缓冲区修改字符串,而不创建新的对象 public static ATM_she_ji.Menu menu; // 静态的菜单界面 public static File usersfile; public static StringBuilder u_String = new StringBuilder(); static Reader fw; // 用于同步 fw 的操作 public static void main(String[] args){ // throws 不在本方法中进行异常处理 usersList = new ArrayList<zhanghu>(); // 账户表,用数组的形式 File users = new File("users.txt"); //用户文本 if(!users.exists()) { // 若文件存在则为true, isfile 文件存在为false try { users.createNewFile(); //创建新的文本 Writer fw = new FileWriter("users.txt"); // 文本写入 fw.write("vera 123456 88888"); // 默认账户 fw.flush(); // 清空缓冲区并完成文件写入操作 fw.close(); }catch(Exception e1) { JOptionPane.showMessageDialog(null,"创建文档失败"); // 弹出消息对话框 } } usersfile = users; // 创建用户文档,存储用户账户,密码,余额信息 usersLRead(); // 读取文档 usersUpdate(); // 文本存储 deng_lu Deng_lu = new deng_lu(); // 账户登陆注册页面 } public static void usersLRead() { // 读取users文档 try { fw = new FileReader("users.txt"); // 创建字符流 }catch(Exception e) { System.out.print("字符流创建失败"); } BufferedReader bfr = new BufferedReader(fw); // 缓冲字符输入流,继承于Reader String temp = ""; try { //System.out.print("开始写入list"); while((temp = bfr.readLine())!= null) { // 如果取出字符不为null String[] tmpstr = new String[5]; tmpstr = temp.split("\\s+"); // 分割空格 //System.out.print("余额:"+tmpstr[2]); zhanghu a = new zhanghu(tmpstr[0],tmpstr[1],tmpstr[2]); usersList.add(a); // System.out.print("读取到"+a.id+",实例化用户"+a.id); } bfr.close(); // 关闭字符输出流 fw.close(); // 关闭文本写入 }catch(Exception e) { System.out.println("读取文档失败"); } } public static void usersUpdate() { // 用户信息存储 try { Writer fw = new FileWriter("users.txt"); StringBuilder tmpstr = new StringBuilder(); for(int i = 0;i < usersList.size();i++) { tmpstr.append(usersList.get(i).id + " "+usersList.get(i).mi_ma+" "+usersList.get(i).money+"\r\n"); } fw.write(tmpstr.toString()); fw.flush(); fw.close(); }catch(Exception e) { e.printStackTrace(); System.out.println("更新用户失败"); } } }
存钱:
import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; 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 cun_qian implements ActionListener{ public JTextField money; public JFrame jfra; public JPanel i0,i1,i2,i3; public JButton que_ding,cancel,exit; public JLabel yu_e; public cun_qian() { jfra = new JFrame("存款"); i0 = new JPanel(); i0.add(new JLabel("账户id:"+Test.d_zhanghu.id)); i1 = new JPanel(); yu_e = new JLabel("账户余额"+Test.d_zhanghu.money); i1.add(yu_e); i2 = new JPanel(); i2.add(new JLabel("存款金额:")); money = new JTextField(20); i2.add(money); i3 = new JPanel(); que_ding = new JButton("确定"); i3.add(que_ding); cancel = new JButton("返回"); i3.add(cancel); jfra.add(i0); jfra.add(i1); jfra.add(i2); jfra.add(i3); jfra.add(que_ding); jfra.add(cancel); jfra.setLayout(new FlowLayout()); // 流式布局 jfra.setVisible(true); // 窗口可见 jfra.setBounds(200,200,350,150); que_ding.addActionListener(this); // 绑定监听器 cancel.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("确定")) { try { if(Integer.parseInt(money.getText())% 100 == 0 && Integer.parseInt(money.getText())>=0 ) { // 调用当前用户的存钱函数 Test.d_zhanghu.cun_qian(Integer.parseInt(money.getText())); yu_e.setText("账户余额:"+Test.d_zhanghu.money); JOptionPane.showMessageDialog(null, "存款成功"); // 弹窗 }else { JOptionPane.showMessageDialog(null, "存款金额须为100的整数倍"); } }catch(ClassCastException e1) { JOptionPane.showMessageDialog(null, "请输入数字整数"); // frame 窗口 }catch(Exception e1){ JOptionPane.showMessageDialog(null, "输入值必须为数字整数"); // e1.getMessage()获取异常详细消息字符串 } money.setText(""); }else { jfra.setVisible(false); // 隐藏窗口 } } }
取钱:
import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; 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 qu_qian implements ActionListener{ public JTextField money; public JFrame jfra; public JPanel i0,i1,i2,i3; public JButton que_ding,cancel,exit; public JLabel yu_e; public qu_qian() { jfra = new JFrame("取款"); i0 = new JPanel(); i0.add(new JLabel("账户id:"+Test.d_zhanghu.id)); i1 = new JPanel(); yu_e = new JLabel("账户余额"+Test.d_zhanghu.money); i1.add(yu_e); i2 = new JPanel(); i2.add(new JLabel("取款金额:")); money = new JTextField(20); i2.add(money); i3 = new JPanel(); que_ding = new JButton("确定"); i3.add(que_ding); cancel = new JButton("返回"); i3.add(cancel); jfra.add(i0); jfra.add(i1); jfra.add(i2); jfra.add(i3); jfra.add(que_ding); jfra.add(cancel); jfra.setLayout(new FlowLayout()); // 流式布局 jfra.setVisible(true); // 窗口可见 jfra.setBounds(200,200,350,150); que_ding.addActionListener(this); // 绑定监听器 cancel.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { // 按下键后。。 String i = e.getActionCommand(); // i 赋值为点击的按键的值 if(e.getActionCommand().equals("确定")) { try { if(Integer.parseInt(money.getText())% 100 == 0 && Integer.parseInt(money.getText())>=0 ) { if(Integer.parseInt(money.getText()) > Test.d_zhanghu.money) { JOptionPane.showMessageDialog(null, "余额不足"); }else { // 调用当前用户的存钱函数 Test.d_zhanghu.qu_qian(Integer.parseInt(money.getText())); yu_e.setText("账户余额:"+Test.d_zhanghu.money); JOptionPane.showMessageDialog(null, "取款成功"); // 弹窗 } }else{ JOptionPane.showMessageDialog(null, "取款金额须为100的正整数倍"); } }catch(ClassCastException e1) { // 捕获 数据类型错误 JOptionPane.showMessageDialog(null, "请输入数字整数"); // frame 窗口 }catch(Exception e1){ JOptionPane.showMessageDialog(null, "输入值必须为数字整数"); // e1.getMessage()获取异常详细消息字符串 // qu_qian 里抛出的 } money.setText(""); }else { jfra.setVisible(false); // 隐藏窗口 } } }
账户:
public class zhanghu { int money; String id; String mi_ma; public zhanghu(String id,String mi_ma, String money) { // 注册和读取用户时用 this.id = id; this.mi_ma = mi_ma; this.money = Integer.parseInt(money); // money 返回int值 } // 抛出异常由相关的界面类弹窗处理异常 // 取钱 public void qu_qian(int money){ this.money -=money; Test.usersUpdate(); // 更新用户文档 } // 存钱 public void cun_qian(int money){ this.money += money; Test.usersUpdate(); // 更新用户信息 } }
菜单:
import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;// 动作监听器 import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.WindowConstants; public class Menu implements ActionListener{ public JFrame fra; // 窗口 private JPanel m; // 布局 private JTextField mi_ma,cha_mi_ma; private JButton qu_qian; // 操作按键 private JButton cun_qian; public Menu() { fra = new JFrame("操作菜单"); fra.setResizable(false); // 设置不可放大 fra.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);// 静态常量,退出窗体 JButton cao_zuo = new JButton("请选择操作项目 "); JButton cun_qian = new JButton("存 款"); JButton qu_qian = new JButton("取 款"); JButton exit = new JButton("退 卡"); //m = new JPanel(); //cao_zuo = new JLabel("操作项目:") //m0.add(cao_zuo); //fra.add(m0); m = new JPanel(); m.add(cao_zuo); m.add(qu_qian); m.add(cun_qian); m.add(exit); m.setLayout(new GridLayout(4,1,30,30)); // 网格布局管理器,组件的行列分布,20为组件间的横纵间距 fra.add(m); fra.pack(); // 自动适应大小 fra.setVisible(true); // 图形界面可见 fra.setLayout(new FlowLayout()); // 布局管理器,流式布局 fra.setBounds(200,200,350,280); qu_qian.addActionListener(this); // 增加监听(绑定监听器) cun_qian.addActionListener(this); exit.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub String i = e.getActionCommand(); // i 赋值为点击的按键的值 if(i.equals("取 款")) { qu_qian qu = new qu_qian(); }else if(i.equals("存 款")){ cun_qian cun = new cun_qian(); }else if(i.equals("退 卡")) { fra.setVisible(false); // 隐藏页面 deng_lu Deng_lu = new deng_lu(); JOptionPane.showMessageDialog(null, "请记得取走您的银行卡"); } } }
登陆/ 注册:
import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; //import java.io.Reader; 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; import javax.swing.WindowConstants; public class deng_lu implements ActionListener{ private JFrame frame; private JPanel p0,p1,p2,p3,p4; // 布局 private JTextField userName; private JTextField mi_ma,cha_mi_ma; private JButton deng; private JButton zhu_ce; // private Reader fw; // Boolean Zhu_ce = true; // 控制是否注册的变量 public deng_lu() { frame = new JFrame("登陆ATM"); frame.setResizable(false); // 设置为不能放大 frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 右上角x 退出 p0 = new JPanel(); p0.add(new JLabel("银行储蓄ATM")); // 标签 frame.add(p0); p1 = new JPanel(); p1.add(new JLabel("\t用 户 名:")); userName = new JTextField(20); p1.add(userName); p2 = new JPanel(); p2.add(new JLabel("\t 密 码:")); mi_ma = new JTextField(20); //JPasswordField mi_ma = new JPasswordField(20) ; //mi_ma.setEchoChar('*') ;// 设置回显 //String mi = String.valueOf(mi_ma.getPassword()); p2.add(mi_ma); p3 = new JPanel(); deng = new JButton(" 登陆 "); zhu_ce = new JButton(" 注册 "); p3.add(deng); p3.add(zhu_ce); p4 = new JPanel(); p4.add(new JLabel("确认密码:")); cha_mi_ma = new JTextField(20); p4.add(cha_mi_ma); frame.add(p1); frame.add(p2); frame.add(p4); // 确认密码框 ,放在注册键的前面 frame.add(p3); frame.pack(); frame.setVisible(true); p4.setVisible(false); deng.addActionListener(this); // 添加监听 zhu_ce.addActionListener(this); frame.setBounds(200,200,350,250); // 设置大小 frame.setLayout(new FlowLayout()); // 流式布局 } @Override public void actionPerformed(ActionEvent e) { // 动作 // TODO Auto-generated method stub if(e.getActionCommand().equals(" 注册 ")) { // 如果点击注册 if(p4.isVisible() == false) { // 判断部件是否可见 p4.setVisible(true); deng.setText(" 取消 "); // 将登陆改为取消,同时触发取消监听器 Zhu_ce = true; return; } if(Zhu_ce == true) { if(userName.getText().equals("")) { // 如果userName文本为空 JOptionPane.showMessageDialog(frame, "用户名不能为空"); // 弹窗 return; }else { for (int i = 0;i<Test.usersList.size();i++) { if(Test.usersList.get(i).id.equals(userName.getText())) { JOptionPane.showMessageDialog(frame, "该用户已被注册"); userName.setText(""); // 清空输入框 mi_ma.setText(""); cha_mi_ma.setText(""); return; // 若用户名同名,结束方法 } } } if(mi_ma.getText().length()!=6) { //&&mi_ma.getText().equals("") JOptionPane.showMessageDialog(frame, "请输入六位密码"); // 弹窗 return; }else { if(cha_mi_ma.getText().equals(mi_ma.getText())) { // 注册账户,账户实例化 zhanghu zhang_zhu_ce = new zhanghu(userName.getText(),mi_ma.getText(),"0"); JOptionPane.showMessageDialog(frame,"注册成功,请登陆"); Test.usersList.add(zhang_zhu_ce); // 加入Test类的静态用户list Test.usersUpdate(); return; }else { JOptionPane.showMessageDialog(frame, "两次输入的密码不一致,请重新输入"); return; } } } } if(e.getActionCommand().equals(" 登陆 ")) { for(int i = 0;i<Test.usersList.size();i++) { if(Test.usersList.get(i).id.equals(userName.getText())) { if(mi_ma.getText().equals(Test.usersList.get(i).mi_ma)) { JOptionPane.showMessageDialog(frame, "登陆成功"); Test.d_zhanghu = Test.usersList.get(i); // 将list中符合登陆输入密码的账户类设为当前Test类中的静态的“当前类” Test.file = new File(Test.d_zhanghu+".text"); // 在文件中添加新的txt Menu menu = new Menu(); // 实例化菜单窗口 Test.menu = menu; frame.setVisible(false); // 隐藏登陆窗口 return; }else { JOptionPane.showMessageDialog(frame, "密码错误"); cha_mi_ma.setText(""); // 清空 return; } } } JOptionPane.showMessageDialog(frame, "该用户不存在"); } if(e.getActionCommand().equals(" 取消 ")) { p4.setVisible(false); // 隐藏窗口 deng.setText(" 登陆 "); Zhu_ce = false; // 不可注册 } } }
参考于:https://blog.csdn.net/qq_37724011/article/details/78682028