ATM(JAVA课程设计)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ATM柜员机模拟程序
摘要
使用图形用户界面。
当输入给定的卡号和密码(初始卡号为123456和密码为123456)时,系统能登录ATM柜员机系统,用户可以按照以下规则进行:查询余额:初始余额为50000元
ATM取款:每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。
ATM存款:不能出现负存款。
修改密码:只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。
我所设计的ATM柜员机主要是由登录页面模块还由选择服务模块组成,其中选择服务模块又由取款模块、查询余额模块、修改密码模块、退卡模块组成。
一个系统界面的好坏直接影响到用户的操作,界面设计要求样式美观、简单明了、方便易操作。
我设计的界面主要分为窗体、菜单、按钮和文本输入框几个部分,分别执行相应的操作。
关键字:图形用户界面;ATM;柜员机;模拟程序;模块;
ATM machines simulation program
Abstract
Use the graphical user interface. When the input given card number and password (initial card number for 123456 and password for 123456), the system can login ATM machines system, users can according to the following rules:
Inquires the balance: initial balance is 50000 yuan ATM withdrawals: every time a multiple of the amount of, the total will not more than 5000 yuan, the amount of withdrawals allows no overdraft.
ATM deposits: can't negative deposits.
Change the password: only the correct password is old, the new password accords with a requirement, and two enter the same case can be modified successfully password.
I designed by ATM machines is mainly composed of the login page module by choice service module is, selecting the service module by withdrawals and module, inquires module, modify the password balance module, return card modules. A system interface has a direct influence on the user's operation, interface design requirements style beauty, simple and clear, make the operation easy. I design interface are divided into form, menu, button and text input box sections
Keywords:graphical user interface; ATM; Automated Teller Machine; simulation program; module;
1 系统需求分析
1.1 功能需求分析
本ATM柜员机的主要功能如下所述:
要求使用图形用户界面。
当输入给定的卡号和密码(初始卡号为123456和密码为123456)时,系统能登录ATM柜员机系统,用户可以按照以下规则进行:
●查询余额:初始余额为50000元
●ATM取款:每次取款金额为100的倍数,总额不超过5000元,支取金
额不允许透支。
●ATM存款:不能出现负存款。
●修改密码:只有旧密码正确,新密码符合要求,且两次输入相同的情况
下才可以成功修改密码。
1.2 其他需求分析
(1)性能描述
实时性好、灵活性强、易于不同年龄阶段的人操作。
(2)设计约束
开发工具:Eclipse 8.6
运行环境:Windows 7
能实现用户所定义的各项需求。
(3)界面要求
以Windows窗口形式显示,标题栏为ATM柜员机名称,右上角有最小化按钮、最大化按钮、关闭按钮,不同的窗口中有不同的按钮和选择菜单。
2 概要设计
我设计的ATM柜员机主要是由各个Windows窗口组成,它是由登录页面、选择服务、取款、查询余额、修改密码和退卡等功能。
它的各种按钮的事件和功能可以简单的模拟ATM柜员机的要求。
3 详细设计
3.1 总体设计
我所设计的ATM柜员机主要是由登录页面模块还由选择服务模块组成,其中选择服务模块又由取款模块、查询余额模块、修改密码模块、退卡模块组成。
其功能结构图如下所示:
图1 ATM功能结构示意图
3.2 ATM柜员机界面设计
我觉得一个系统的界面应该要简单明了,当然样式美观就更好了。
我设计的界面主要是由窗体组成,操作简单。
而每一个窗口则执行相应的功能。
一个系统界面的好坏直接影响到用户的操作,界面设计要求样式美观、简单明了、方便易操作。
我设计的界面主要分为窗体、菜单、按钮和文本输入框几个部分,分别执行相应的操作。
(1)窗体的设计
窗体整个框架使用Frame类构造,Frame有自己的外边框和自己的标题,创建Frame时可以指定其窗口标题,我创建的窗口标题是各个不同功能的模块的名字,比如说查询余额,还有取款等。
相应源代码为:WindowBox(String s,Account act){super(“ATM柜员机”);} 、Selection(String s,Account act){
super(s);
}
向Frame窗口中添加组件使用add()。
例如:button1 = new Button("存款");
p1.add(button1);
this.add(p1);
每个Frame在其右上角都有三个控制图标,分别代表将窗口最小化、窗口最大化和关闭的操作,其中最小化和最大化操作Frame可自动完成,而关闭窗口操作实现需要书写有关的代码,在我的程序中我采用的是对WINDOWS_CLOSING事件做出响应,调用dispose()方法关闭窗口。
Frame也可以引发WindowsEvent类代表的窗口事件。
相应源代码为:
addWindowListener(new WindowAdapter() //窗口侦听器,以从此窗口接收窗口事件
{public void windowClosing(WindowEvent e) //处理窗口关闭事件
{ System.exit(0); }
});
}
(2)窗体的主要结构的设计
我所设计的窗口的主要结构的特点就是每个窗口都对应着一个特定的功能。
比如说报各种各样的错,还有各种查询余额、取款、选择服务等,所以它们都是由各种按钮和文本框,标签组成的,而联系各个窗体成为一个整体的就是各个按钮的监听事件。
所以整个设计就趋向简单化了。
为了定义各个按钮所对应的命令和操作,首先需要将各个按钮注册给实现了动作事件的监听接口ActionListener的监听者,然后为监听者定义
actionPerformed(ActionEvent e)方法,在这个方法中调用 e.getSource()或e.getActionCommand()来判断用户点击的菜单子项,并完成这个菜单子项定义的操作。
3.3 各功能模块设计
3.3.1 登陆页面模块设计
与ATM柜员机打交道比较多的,也是大家对安全比较关心的问题:密码。
所以第一个界面就是要输入密码和卡号才能继续服务。
我定义了文本框累的对象tf1,tf2。
抓药是用于输入单行的文本;文本区调用public String getText()方法,获取用户想要的字符串。
用来判断输入的密码和卡号是否正确,如果不正确的话,则弹出密码或卡号错误的警告框,并用dispose()关掉窗口。
此模块相应的部分源代码为:
public void actionPerformed(ActionEvent e){
Account act;
String card;
String pwd;
act=new Account("123456","Devil","123456",50000);//初始化
/*选择各种服务*/
if(e.getSource() == button1){
String number1,number2;
number1=tf1.getText();
number2=tf2.getText();
/*判断密码和卡号是否正确*/
if((act.get_Code().equals(number1))&&(act.get_Password().equals(number2))){
dispose();
/*卡号和密码都正确则进入功能选择窗口*/
Selection s = new Selection("选择服务",act);
}else{
dispose();
ErrorWarn ew = new ErrorWarn("消息!",act);
}
}
/*退卡*/
if(e.getSource()==button2){
System.exit(0);
dispose();
}
}
3.3.2 选择服务模块设计
在选择服务模块中,有各种ATM的服务功能,只要用户在该界面中选择按钮,它就会弹出各个相应的界面。
每一个按钮都有监听器,在选择了按钮后,java.awt.event中的ActionEvent类创建一个事件对象,并将它传递给方法public void actionPerformed(ActionEvent e)中的参数e,监视器就会知道所发生的事件,对此事件进行处理。
其中的部分源代码为:
p.add(new Label("请选择你要的服务"));
this.add(p);
button1 = new Button("存款");
p1.add(button1);
this.add(p1);
button2 = new Button("取款");
p2.add(button2);
this.add(p2);
button3 = new Button("查询余额");
p3.add(button3);
this.add(p3);
button4 = new Button("退出");
p4.add(button4);
this.add(p4);
button5 = new Button("修改密码");
p5.add(button5);
this.add(p5);
this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){
System.exit(0);
}
});
button2.addActionListener(this);
button3.addActionListener(this);
button4.addActionListener(this);
button5.addActionListener(this);
//setLayout(new GridLayout());
setBounds(150,150,200,200);
setVisible(true);
validate();
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==button2){//取款
dispose();
GetBalance gb = new GetBalance("取款",act);
}
if(e.getSource()==button3){//查询余额
Query q =new Query("查询余额",act);
dispose();
}
else if(e.getSource()==button4){//退出
System.exit(0);
dispose();
}
else if(e.getSource()==button5){//修改密码
ChangePassword cp = new ChangePassword("修改密码",act);
dispose();
}
}
}
3.3.3 取款模块设计
在取款模块中,和其他的界面也是同样的结构。
也是有一个文本框和一个按钮还有标签组成的。
用户在文本框中输入他想取的数额,但是必须是100的倍数,而且每一次最多只能取5000块。
当然了取款的时候也不能超过卡里的余额,再就是卡里的余额不可以为负,否则就会弹出报错的窗口。
其方法为:if(e.getSource()==button){
/*判断余额是否为负*/
if(act.get_Money()<0){
dispose();
ErrorWarn4 ew4 = new ErrorWarn4("消息!",act);
}
/*判断取款数额是否小于卡里余额*/
else if(money<=act.get_Money()){
/*取款的数额必须是100的倍数且每次最多只能取5000块*/
if((money%100!=0)||(money>=5000)){
dispose();
ErrorWarn6 ew6 = new ErrorWarn6("消息!",act);
}
act.set_Balance(money);//重新设置卡里的余额
this.setVisible(false);
/*取款后就再次进入选择界面*/
Selection s = new Selection("选择服务",act);
//dispose();
}else if(money>act.get_Money()){
dispose();
ErrorWarn5 ew5 = new ErrorWarn5("消息!",act);
}
}
3.3.4 修改密码模块设计
在修改密码模块中,首先你必须要输入你的旧密码是否正确,否则就会报错。
再一个就是要两次输入你的新密码,且两次药匹配,否则也会报错,然后再重新回到修改密码的界面。
在修改密码时用到的方法为:
/*判断旧密码是是否正确*/
if(pwd2.equals(act.get_Password())){
/*判断两次输入的密码是否匹配*/
if(pwd3.equals(pwd4)){
/*如果都正确的话就设置新密码*/
act.setPassword(pwd3);
dispose();
Selection s = new Selection("选择",act);
}else{
dispose();
ErrorWarn2 ew2 = new ErrorWarn2("消息",act);
}
}else{
this.setVisible(false);
ErrorWarn3 ew1 = new ErrorWarn3("消息",act);
dispose();
}
3.3.5 退卡模块设计
在退卡模块设计中,这个方法就更加的简单了,它只是用了if(e.getSource()==button4){//退出
System.exit(0);
dispose();
}
这个方法就可以实现了,这里就不再多说了。
3.4 异常处理情况说明
(1)打开、保存文件时的异常处理
需要处理的异常:IOException
(2)数据库访问时的异常处理
需要处理的异常:SQLException
(3)加载类时的异常处理
需要处理的异常:ClassNotFindException,当应用程序试图使用Class类中的forName方法通过字符串名加载类时,但是没有找到具有指定名称的类的定义。
(4)加载URL时的异常
需要处理的异常:MalformedURLException,抛出这一异常指示出现了错误
的URL。
或者在规范字符串中找不到任何合法协议,或者无法分析字符串。
4设计和调试分析
4.1调试过程遇到的问题及解决方法
如图所示的逻辑错误,即输入错误的卡号或错误的密码也能进入默认账户:
修正方法:新建一个actionPerformed(ActionEvent e)构造器
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button) {
dispose();
Selection s = new Selection("选择服务", act);// 返回选择服务窗口
}else if(e.getSource() == button1){
dispose();
WindowBox win = new WindowBox("登入");
}
}
5 用户使用说明
账户登入:初始账户为123456,初始密码:123456
查询余额:初始余额为50000元
ATM取款:每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。
ATM存款:不能出现负存款。
修改密码:只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。
6测试数据和测试结果
(1)打开DOS,编译运行程序后,将会看到如下的界面,如图2所示。
如果输入的密码或卡号不正确的话就会报右下图的错误。
图2 主界面—登陆页面
(2)选择服务界面效果
当输入的密码和卡号正确,单击确定后就会进入到选择服务的界面,如图3所示。
然后就可以选择所需要的服务了。
图3 选择服务界面
(3)存款界面,如图4所示。
图4 取款界面
当输入的钱数不是100的倍数或每一次大于5000时就会报如下图的错误。
(3)取款界面,如图5所示。
图5 取款界面
当输入的钱数不是100的倍数或每一次大于5000时就会报图6的错误。
图6 输入错误1
当取款时如果超过卡里的余额的话就会报图7的错误。
图7 输入错误2
(4)查询余额界面,如图8所示。
图8 查询余额界面
经过测试,所有的功能基本上都实现了,而且运行正常。
参考文献
[1] 王萌,刘婧,来宾著.JAVA程序设计[M]北京冶金工业出版社,2004
[2] 黄聪明精通JAVA2程序设计[M]北京:清华大学出版社,2004.4
[3] 王文涛,袁海燕JAVA实用程序设计100例[M]北京:人民邮电出版社,2005.5
[4] 雍俊海JAVA程序设计[M]北京:清华大学出版社,2006.8
[5] 刘宝林JAVA程序设计与案例[M]北京:高等教育出版社,2006.11
附录
import javax.swing.*;
import java.awt.*;
import javax.swing.border.*;
import java.awt.event.*;
import java.io.*;
/*登陆页面首窗口*/
class WindowBox extends Frame implements ActionListener{ Box baseBox,box1,box2;
TextField tf1,tf2;
Button button1;
Button button2;
WindowBox(String s){//构造方法
super(s);
tf1 = new TextField(6);
tf2 = new TextField(6);
box1= Box.createVerticalBox();
box1.add(new Label("请输入你的卡号")); //输入卡号
box1.add(Box.createVerticalStrut(8));
box1.add(new Label("请输入你的密码"));//输入密码
box2=Box.createVerticalBox();
box2.add(tf1);
//box2.add(new TextField(16));
box2.add(Box.createVerticalStrut(8));
box2.add(tf2);
//box2.add(new TextField(16));
baseBox=Box.createHorizontalBox();
baseBox.add(box1);
baseBox.add(Box.createHorizontalStrut(10));
baseBox.add(box2);
add(baseBox);
button1= new Button("确定");//加入按钮
button1.addActionListener(this);
add(button1);
button2 = new Button("退卡");//退卡按钮
button2.addActionListener(this);
add(button2);
setLayout(new FlowLayout());
/*监听器*/
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
setBounds(120,125,200,175);
setVisible(true);
}
public void actionPerformed(ActionEvent e){
Account act;
String card;
String pwd;
act=new Account("123456","Devil","123456",10000);//初始化/*选择各种服务*/
if(e.getSource() == button1){
String number1,number2;//输入的两个卡号和密码的变量
number1=tf1.getText();
number2=tf2.getText();
/*判断两次输入的卡号和密码是否正确*/
if((act.get_Code().equals(number1))&&(act.get_Password().equals(number2))){
dispose();
Selection s = new Selection("选择服务",act);
}else{
dispose();
//ErrorWarn ew = new ErrorWarn("消息!",act);//报输入密码或卡号不正确
}
} if(e.getSource()==button2){
System.exit(0);
dispose();//退出
}
}
}
import java.awt.*;
import java.awt.event.*;
/*选项*/
class Selection extends Frame implements ActionListener {
Button button1, button2, button3, button4, button5;
Panel p1 = new Panel();
Panel p2 = new Panel();
Panel p3 = new Panel();
Panel p4 = new Panel();
Panel p5 = new Panel();
Panel p = new Panel();
Account act;
public Selection() {
}
Selection(String s, Account act) {
super(s);
this.act = act;
this.setLayout(null);
this.setLayout(new GridLayout(6, 1));
p.add(new Label("请选择你要的服务"));
this.add(p);
/* 各种服务功能*/
button1 = new Button("存款");
p1.add(button1);
this.add(p1);
button2 = new Button("取款");
p2.add(button2);
this.add(p2);
button3 = new Button("查询余额");
p3.add(button3);
this.add(p3);
button4 = new Button("退出");
p4.add(button4);
this.add(p4);
button5 = new Button("修改密码");
p5.add(button5);
this.add(p5);
this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);
button4.addActionListener(this);
button5.addActionListener(this);
setBounds(150, 150, 200, 200);
setVisible(true);
validate();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button1){// 存款
dispose();
Deposite de = new Deposite("存款",act);
}
if (e.getSource() == button2) {// 取款
dispose();
GetBalance gb = new GetBalance("取款", act);
}
if (e.getSource() == button3) {// 查询余额
Query q = new Query("查询余额", act);
dispose();
} else if (e.getSource() == button4) {// 退出
System.exit(0);
dispose();
} else if (e.getSource() == button5) {// 修改密码
ChangePassword cp = new ChangePassword("修改密码", act);
dispose();
}
}
}
import java.awt.Button;
import java.awt.*;
import java.awt.event.*;
import javax.swing.Box;
/*存款*/
public class Deposite extends Frame implements ActionListener{ Box baseBox, box1, box2;
Button button;
TextField tf;
Account act;
Deposite(String s, Account act) {// 构造函数
super(s);
this.act = act;
button = new Button("确定");
Panel panel = new Panel();
Panel panel1 = new Panel();
tf = new TextField(6);
this.setLayout(new GridLayout(2, 1));
panel1.add(new Label("请输入你想存钱的数目,这里”输入金额“是为了模拟程序而虚构的"));
panel1.add(tf);
panel.add(button);
this.add(panel1);
this.add(panel);
button.addActionListener(this);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setBounds(200, 200, 450, 150);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
double money;
money = Double.parseDouble(tf.getText().trim());
if(e.getSource()==button&&money%100==0&&money>0){
act.set_Balance(- money);// 重置余额
this.setVisible(false);
dispose();
Selection s = new Selection("选择", act);// 返回选择服务窗口}else
dispose();
ErrorWarn error = new ErrorWarn(act);
}
}
import javax.swing.*;
import java.awt.*;
import javax.swing.border.*;
import java.awt.event.*;
/*取款*/
class GetBalance extends Frame implements ActionListener {
Box baseBox, box1, box2;
Button button;
TextField tf;
Account act;
GetBalance(String s, Account act) {// 构造函数
super(s);
this.act = act;
button = new Button("确定");
Panel panel = new Panel();
Panel panel1 = new Panel();
tf = new TextField(6);
this.setLayout(new GridLayout(2, 1));
panel1.add(new Label("请输入你想取钱的数目"));
panel1.add(tf);
panel.add(button);
this.add(panel1);
this.add(panel);
button.addActionListener(this);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setBounds(200, 200, 400, 150);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
double money;
money = Double.parseDouble(tf.getText().trim());
if (e.getSource() == button) {
if (act.get_Money() < 0) {// 判断余额是否为负
dispose();
ErrorWarn error = new ErrorWarn("错误提示",act);
} else if (money <= act.get_Money()) {// 取钱的数额不大于余额
if ((money % 100 != 0) || (money >= 5000)) {// 取钱数为100的倍数或不大于5000
dispose();
ErrorWarn error = new ErrorWarn("错误提示",act);
}else{
act.set_Balance(money);// 重置余额
this.setVisible(false);
Selection s = new Selection("选择服务", act);// 返回选择服务窗口
}
} else if (money > act.get_Money()) {// 判断取款数额是否大于余额
dispose();
ErrorWarn error = new ErrorWarn("错误提示",act);
}
}
}
}
import javax.swing.*;
import java.awt.*;
import javax.swing.border.*;
import java.awt.event.*;
/*查询余额*/
class Query extends Frame implements ActionListener {
// Account act;
Button button;
Account act;
Query(String s, Account act) {// 构造函数
super(s);
this.act = act;
button = new Button("确定");
// TextField tf = new TextField(6);
Panel panel1 = new Panel();
Panel panel = new Panel();
panel1.add(new Label("你的余额为:" + act.get_Money()));// 查询余额的方法
button.addActionListener(this);
panel.add(button);
this.add(panel);
this.add(panel1);
this.setLayout(new GridLayout(2, 1));
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setBounds(200, 200, 400, 150);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button) {
dispose();
Selection s = new Selection("选择服务", act);// 返回选择服务窗口}
}
}
import javax.swing.*;
import java.awt.*;
import javax.swing.border.*;
import java.awt.event.*;
/*更改密码*/
class ChangePassword extends Frame implements ActionListener { Panel panel1 = new Panel();
Panel panel2 = new Panel();
Panel panel3 = new Panel();
Panel panel = new Panel();
TextField tf4, tf5, tf6;
Button button;
Account act;
ChangePassword(String s, Account act) {
super(s);
this.act = act;
tf4 = new TextField(6);
tf5 = new TextField(6);
tf6 = new TextField(6);
button = new Button("确定");
button.addActionListener(this);
/* 建立新密码*/
panel1.add(new Label("请输入你的旧密码:"));
panel1.add(tf4);
panel2.add(new Label("请输入你的新密码:"));
panel2.add(tf5);
panel3.add(new Label("请再次输入你的新密码"));
panel3.add(tf6);
panel.add(button);
this.add(panel1);
this.add(panel2);
this.add(panel3);
this.add(panel);
setLayout(new GridLayout(4, 1));
setBounds(200, 200, 250, 250);
this.setVisible(true);
/* 窗口事件*/
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
/* 判断事件源,看条件是否成立再修改密码*/
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button) {
String pwd2, pwd3, pwd4;
pwd2 = tf4.getText();
pwd3 = tf5.getText();
pwd4 = tf6.getText();
if (pwd2.equals(act.get_Password())) {// 判断旧密码是否正确
if (pwd3.equals(pwd4)) {// 判断两次输入的新密码是个匹配
act.setPassword(pwd3);// 启用新的密码
dispose();
Selection s = new Selection("选择", act);// 返回选择服务窗口} else {
// this.setVisible(true);
// ErrorWarn2 ew = new ErrorWarn2("消息",act);
dispose();
// ErrorWarn2 ew2 = new ErrorWarn2("消息",act);
}
} else {
this.setVisible(false);
// ErrorWarn3 ew1 = new ErrorWarn3("消息",act);
dispose();
}
}
}
}
import java.awt.*;
import java.awt.event.*;
/*错误提示*/
public class ErrorWarn extends Frame implements ActionListener{ Button button;
Account act;
Button button1;
ErrorWarn(String s, Account act) {// 构造函数
super(s);
this.act = act;
button = new Button("确定");
Panel panel1 = new Panel();
Panel panel = new Panel();
panel1.add(new Label("输入有误,请重新输入"));//错误信息
button.addActionListener(this);
panel.add(button);
this.add(panel);
this.add(panel1);
this.setLayout(new GridLayout(2, 1));
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setBounds(200, 200, 400, 150);
setVisible(true);
}
ErrorWarn(String s) {// 构造函数
super(s);
button1 = new Button("确定");
Panel panel1 = new Panel();
Panel panel = new Panel();
panel1.add(new Label("输入有误,请重新输入"));//错误信息button1.addActionListener(this);
panel.add(button1);
this.add(panel);
this.add(panel1);
this.setLayout(new GridLayout(2, 1));
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setBounds(200, 200, 400, 150);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button) {
dispose();
Selection s = new Selection("选择服务", act);// 返回选择服务窗口}else if(e.getSource() == button1){
dispose();
WindowBox win = new WindowBox("登入");
}
}
}
/*主函数*/
class ATM {
public static void main(String[] args) {
new WindowBox("登录页面");
}
}。