继《简单Java小程序---无界面ATM机》以后,尝试对有界面ATM机改写,对面向对象的了解又深了一层!
桌面的创建过程
由于使用的NetBean软件没有提供专用的控件拖拽使用功能!所有的控件都需要通过代码添加。添加过程如图:
实例化的顺序为从上到下:frame--container--JPanel--control,实例化container与JPanel的同时考虑窗体布局格式,即控件在以窗体上以怎样的格局显示。容器大小确实从上到下依次减小,实现包含关系。
Container pane; //用于标识每一个主面板
CardLayout cc=new CardLayout(); //系统采用盒状的方法布局
JPanel panLogin=new JPanel();
BoxLayout v=new BoxLayout(panLogin,BoxLayout.Y_AXIS); //采用盒状布局
panLogin.setLayout(v);
JPanel pt=new JPanel();
panLogin.add(pt);//空出第一行
pt=new JPanel();
JLabel labTop=new JLabel("欢迎进入农业银行自动取款机");//添加标题
labTop.setFont(new Font("宋体",Font.PLAIN,24));
labTop.setForeground(Color.red);
pt.add(labTop);
panLogin.add(pt);
pane.add(panLogin,"登陆");//最终生成布局格式
该布局方式就是采用BoxLayout(盒式布局)纵向格式容纳控件,就像一个个箱子摞在一起一样。固定的布局格式为编程人员提供一种模式,缺点是修改起来不方便,并不能像vb里面的提供的控件一样直接拖拽使用。
可以添加空文本框或者container的方式实现美观效果,就像上图中账号与标题之间的空隙是通过空container来添加的。
功能调用问题
Java编程特别能够体现面向对象的方法(但是现在理解还不深),本实例抽象的类界限特别清晰:
Java的按钮通过事件监听机制来实现对一个事件的操作,首先在控件添加到面板前添加事件监听:
butOK.addActionListener(new java.awt.event.ActionListener() { //确定按钮的监听事件
@Override
public void actionPerformed(ActionEvent e) {
butOKActionPerformed(e); //To change body of generated methods, choose Tools | Templates.
}
});
pt=new JPanel();
pt.add(butOK);
具体的实现功能butOKActionPerformed(e)通常为代码的清晰性考虑,在类的结尾一部分统一编写所有要实现的方法,这样提高代码的可读性(利用的是划分模块的思想)。
ATM机在ATM类中定义了一个对象容器v存放账户(小例子并没有用到数据库),因此fram类中要想使用ATM类中的方法不可以重新实例化对象,必须使用原有的对象。
对于这个界面中定义的存储,取款,查询是在登陆一个账户的情况下执行该对象的方法,这样实现:
private void bPutActionPerfromed(java.awt.event.ActionEvent e){ //接听充值事件
int num=Integer.parseInt(JOptionPane.showInputDialog(this,"请输入要充值的金额:")); //获得弹出框中的数据
num=atm.getCurrent().putMoney(num); //当前账户的putMoney方法(同属于一个项目,用getCurrent就可以实现
labBoom.setText(" 您存入了"+num+"元");
}
如果账户a实现对账户b的转账操作的话,就需要先获取输入的账户(Frame类),然后调用ATM中的转账方法:
转账方法(ATM类):
public boolean tran(String account, int n) { //转账必定获得账户名称,和转账金额
int i;
Account a;
for (i = 0; i < v.size(); i++) {
a = v.get(i); //获得容器中的账户
if (a.getNo().equals(account)) { //accout中的获得账户名方法获得账户名与传进的字符是否相等
a.putMoney(n); //为accout对象存钱
return true;
}
}
return false;
}
转账实现(Frame类):
private void butOK1ActionPerformed(java.awt.event.ActionEvent e){ //转账确定事件
String no=txtAccount1.getText();
String no1=txtAccount2.getText();
if(no.equals(no1)){
String num=new String(txtBalance.getText());
Integer num1= Integer.parseInt(num); //输入的字符类型转换为整型
num1=atm.getCurrent().getMoney(num1);//登陆账户获得取款方法
atm.tran(no, num1); //执行转账方法
JOptionPane.showMessageDialog(this, "恭喜您,转账已成功","转账",JOptionPane.PLAIN_MESSAGE);
}else{ //确保两次输入账户相同才准许转账
JOptionPane.showMessageDialog(this, "您输入的账户前后不一致,请重新输入","转账",JOptionPane.PLAIN_MESSAGE);
}
txtAccount1.setText(""); //转账结束将文本框清空
txtAccount2.setText("");
txtAccount1.requestFocus(); //账户文本框获得焦点
txtBalance.setText("");
}
拓展功能
·1. 显示系统日期,首先引用Java包:
import java.util.*;
import java.text.*;
import java.text.*;
实现方法:
java.util.Date now = new java.util.Date();
DateFormat d1=DateFormat.getDateInstance();
String str1=d1.format(now);
JLabel labDate=new JLabel(str1);
pt=new JPanel();
pt.add(labDate);
DateFormat d1=DateFormat.getDateInstance();
String str1=d1.format(now);
JLabel labDate=new JLabel(str1);
pt=new JPanel();
pt.add(labDate);
2. 添加背景图片:
ImageIcon img = new ImageIcon("image\\1.jpg");//这是背景图片,这种方式可以获取图片相对路径
JLabel imgLabel = new JLabel(img);//将背景图放在标签里。
JButton bReturn=new JButton(""); //添加返回按钮
bReturn.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
bReturnActionPerformd(e);
}
});
panAbout.add(bReturn);
panAbout.add(imgLabel);//注意这里是关键,将背景标签添加到jfram的LayeredPane面板里。
imgLabel.setBounds(0,0,img.getIconWidth(), img.getIconHeight());//设置背景标签的位置
总结:
面向对象的抽象方法一个关键问题是该类中到底应该添加什么属性和方法,比如界面frame类只负责提供控件(包括控件事件)和布局格式等。类的抽象必须要有明确的界限,但这个并不是很容易的。