写个小项目了解一下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包
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); } }
package bank; import java.io.*; import java.util.HashMap; import java.util.Map; import java.util.Set; //数据类是文件和ATM机之间操作用户信息的桥梁 public class Data { //Map储存数据库里所有用户的全部信息 MapuserData = 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 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.*; //自己创造的界面的父类 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); } }
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();//先创建登录界面 } }
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(); } }
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; } }
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; //转账界面 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();//关闭此界面 } }
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();//关闭此界面 } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。