写个小项目了解一下GUI。用java GUI实现银行ATM自动取款机,实现登录界面、登录成功界面、各个操作功能实现界面;用文件来储存用户数据。
设计两个包(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:修改密码界面。
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储存user文件里所有用户的全部信息
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();
}
}
}
}
}
user文件,是直接在idea里创建的File文件,没有后缀,
调用时为"src\bank\user";
也可以创建.txt文件不过在调用时要改为"src\bank\user.txt"。
文件内容的格式:
账号*密码*余额
李四*234*7500.0
张三*123*13100.0
王五*123*1100.0
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();//关闭此界面
}
}
最后运行LoginJFrame类就行了。