JavaGUI实现简单计算器.docx
《JavaGUI实现简单计算器.docx》由会员分享,可在线阅读,更多相关《JavaGUI实现简单计算器.docx(27页珍藏版)》请在冰点文库上搜索。
JavaGUI实现简单计算器
Java面向对象编程
实验报告
题目:
数组与图形化界面
专业:
计算机科学与技术
班级:
1120542
学号:
06
姓名:
聂建建
太原工业学院计算机工程系
2014年5月16日
一、实验目的与要求
1、掌握Java编程中的数组的应用
2、掌握JavaGUI编程的应用以及API的查阅
3、掌握JavaGUI窗体容器、布局管理器、基本组件、事件的注册
实验内容
JavaGUI实现如下图简单计算器
三、实施步骤
1.首先创建所需要的变量,组件,组件数组
/*结果输入框*/
privateJTextFieldresult;
/*操作键之前缓存*/
privateStringBuilderbeforeCache=newStringBuilder();
/*操作键之后缓存*/
privateStringBuilderafterCache=newStringBuilder();
/*清除键*/
privateJButtonclean;
/*数字键*/
privateJButton[]numberButs=newJButton[10];
/*操作键*/
privateMapoperKeyMap=newHashMap();
/*操作标识*/
privatebooleanoperFlag=false;
2.然后对组件进行初始化,将加减乘除等操作间用map集合以键值对的形式添加。
/*初始化组件*/
privatevoidinitComp(){
/*清除按钮初始化*/
clean=newJButton("清除");
/*结果按钮初始化*/
result=newJTextField(10);
/*数字键初始化*/
for(inti=0;i<10;i++){
numberButs[i]=newJButton(""+i);
}
/*操作键的初始化*/
operKeyMap.put("jia",newJButton("+"));
operKeyMap.put("jian",newJButton("-"));
operKeyMap.put("chen",newJButton("*"));
operKeyMap.put("dengyu",newJButton("="));
operKeyMap.put("dian",newJButton("."));
operKeyMap.put("chu",newJButton("/"));
}
3.设置主窗体的属性,包括窗体大小,起始位置
this.setSize(300,300);//设置窗体大小
this.setLocation(350,350);//设置第一次打开的左上角的坐标
4.设置相应的控件的位置,添加在主窗体内
主要分为三大部分,一是位于主窗体北部的TextField空间,用来显示输入和计算结果;二是位于主窗体中部的清楚按钮;三是位于主窗体南部的数字和操作键位。
this.add(result,BorderLayout.NORTH);//设置输入框位于北部
JPanelkeyPanel=newJPanel();
//设置Jpanel的布局GridLayout
GridLayoutgl=newGridLayout(4,4);//四行四列
keyPanel.setLayout(gl);//设置键的布局为gl
this.add(clean,BorderLayout.CENTER);
this.add(keyPanel,BorderLayout.SOUTH);
5.注册相应的监听事件
/**
*注册事件监听
***/
privatevoidaddListenerHandler(){
/*主窗体事件处理*/
this.addWindowListener(newMainWindowListenerImpl());
/*清除按钮事件处理*/
clean.addMouseListener(newMouseListenerImpl());
clean.addActionListener(newCleanButtonActionListenerImpl(this));
/*数字键事件处理*/
for(JButtonnumBut:
numberButs){
numBut.addMouseListener(newMouseListenerImpl());
numBut.addActionListener(newNumKeyActionListenerImpl(this));
}
/*操作键事件处理*/
CollectionoperButtons=operKeyMap.values();
for(JButtonoperBut:
operButtons){
operBut.addMouseListener(newMouseListenerImpl());
operBut.addActionListener(mOperKeyActionListenerImpl);
}
}
privateOperKeyActionListenerImplmOperKeyActionListenerImpl=newOperKeyActionListenerImpl(this);
6.设置主窗体的点击事件,使得退出按钮生效
//设置窗口的关闭按钮的监听事件:
退出
@Override
publicvoidwindowClosing(WindowEvente){
System.out.println("退出了");
System.exit(0);
}
7.设置相应组件点击后的效果
按钮点击按下之后为红色:
publicvoidmousePressed(MouseEvente){
JButtonbt=(JButton)e.getSource();
//设置此组件的前景色
bt.setForeground(Color.RED);
}
鼠标离开之后为黑色:
publicvoidmouseExited(MouseEvente){
JButtonbt=(JButton)e.getSource();
bt.setForeground(Color.black);
}
8.清除键具体的监听事件设置
JTextFieldresult=calculator.getResult();
//获取输入文本
StringresultStr=result.getText();
if(!
resultStr.equals("")){
//文本内容,重置为空
result.setText("");
//缓存清空
StringBuilderbeforeCache=calculator.getBeroreCache();
StringBuilderafterCache=calculator.getAfterCache();
beforeCache.delete(0,beforeCache.length());
afterCache.delete(0,afterCache.length());
calculator.setOperFlag(false);
}
9.数字键具体的监听时间设置
//获得当前操作的数字键
JButtonbutton=(JButton)e.getSource();
//获得数字键对应的输入值
StringnumberValue=button.getText();
if(!
calculator.isOperFlag()){
calculator.getBeroreCache().append(numberValue);
calculator.getResult().setText(
calculator.getBeroreCache().toString());
}else{
calculator.getAfterCache().append(numberValue);
calculator.getResult().setText(
calculator.getAfterCache().toString());
}
10.操作计算键具体的部分监听事件设置(+-*/=)
privateCalculatorDemocal;
//运算结果
intresult;
//操作符之前的数字
inta;
//操作符之后的数字
intb;
//操作符标志
intz=0;
publicOperKeyActionListenerImpl(CalculatorDemoc){
this.cal=c;
}
/*
*如果按下操作键盘,依据操作键表示的操作类型,执行相关的计算计算步骤:
1>取得操作键之前的缓存输入2>获取操作键之后的数字键输入
*3>获取相关操作类型,执行计算
*/
@Override
publicvoidactionPerformed(ActionEventevent){
//1>取得操作键之前的缓存输入
StringBuilderbefore=cal.getBeforeCache();
/*获取操作键*/
JButtonbut=(JButton)event.getSource();
//判断操作符
if(but==cal.getOperKeyMap().get("jia")){
z=0;
}elseif(but==cal.getOperKeyMap().get("jian")){
z=1;
}elseif(but==cal.getOperKeyMap().get("chen")){
z=2;
}elseif(but==cal.getOperKeyMap().get("chu")){
z=3;
}
//置空结果显示
cal.getResult().setText("");
cal.setOperFlag(true);
//2>获取操作键之后的数字键输入
StringBuilderafter=cal.getAfterCache();
if(but==cal.getOperKeyMap().get("dengyu")){
a=Integer.parseInt(before.toString().trim());
b=Integer.parseInt(after.toString().trim());
switch(z){
case0:
result=a+b;
break;
case1:
result=a-b;
break;
case2:
result=a*b;
break;
case3:
result=a/b;
break;
default:
break;
}
cal.getResult().setText(""+result);
}
}
四、实验结果
主界面:
5和3分别进行+-*/的操作的结果如下:
五、出现的问题及解决的方法
刚开始加减乘除无法实现,后来发现是调用对象的问题,每次调用监听事件都要new一个对象,所以每次都执行的是z=0的默认值,所以每次只执行加操作。
最后给这些按钮注册同一个监听事件,问题解决了
错误之前的代码如下:
CollectionoperButtons=operKeyMap.values();
for(JButtonoperBut:
operButtons){
operBut.addMouseListener(newMouseListenerImpl());
operBut.addActionListener(newOperKeyActionListenerImpl(this));
}
因为我给每一个按钮都加了一个监听对象OperKeyActionListenerImpl,他们的z的值都是独立的,所以,最后点等于号的时候,那里的z的值一直是默认值0,就进去加号那个运算了。
应该给所有按钮绑定同一个监听事件才合理的。
所以修改后的代码如下:
CollectionoperButtons=operKeyMap.values();
for(JButtonoperBut:
operButtons){
operBut.addMouseListener(newMouseListenerImpl());operBut.addActionListener(mOperKeyActionListenerImpl);
}
}
privateOperKeyActionListenerImplmOperKeyActionListenerImpl=newOperKeyActionListenerImpl(
this);
六:
源码
类:
CalcutorDemo
packageCaculator;
importjava.awt.BorderLayout;
importjava.awt.GridLayout;
importjava.util.Collection;
importjava.util.HashMap;
importjava.util.Map;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importjavax.swing.JTextField;
publicclassCalculatorDemoextendsJFrame{
/*结果输入框*/
privateJTextFieldresult;
/*操作键之前缓存*/
privateStringBuilderbeforeCache=newStringBuilder();
/*操作键之后缓存*/
privateStringBuilderafterCache=newStringBuilder();
/*清除键*/
privateJButtonclean;
/*数字键*/
privateJButton[]numberButs=newJButton[10];
/*操作键*/
privateMapoperKeyMap=newHashMap();
/*操作标识*/
privatebooleanoperFlag=false;
publicvoidsetOperFlag(booleanoperFlag){
this.operFlag=operFlag;
}
publicCalculatorDemo(){
initComp();
initMainWindow();
addListenerHandler();
}
/*初始化组件*/
privatevoidinitComp(){
/*清除按钮初始化*/
clean=newJButton("清除");
/*结果按钮初始化*/
result=newJTextField(10);
/*数字键初始化*/
for(inti=0;i<10;i++){
numberButs[i]=newJButton(""+i);
}
/*操作键的初始化*/
operKeyMap.put("jia",newJButton("+"));
operKeyMap.put("jian",newJButton("-"));
operKeyMap.put("chen",newJButton("*"));
operKeyMap.put("dengyu",newJButton("="));
operKeyMap.put("dian",newJButton("."));
operKeyMap.put("chu",newJButton("/"));
}
/**
*初始化Main窗体
***/
privatevoidinitMainWindow(){
this.setSize(300,300);
this.setLocation(350,350);
this.add(result,BorderLayout.NORTH);
JPanelkeyPanle=newJPanel();
//设置JPanel的布局(GridLayout)
GridLayoutgl=newGridLayout(4,4);
keyPanle.setLayout(gl);
keyPanle.add(numberButs[7]);
keyPanle.add(numberButs[8]);
keyPanle.add(numberButs[9]);
keyPanle.add(operKeyMap.get("chu"));
keyPanle.add(numberButs[4]);
keyPanle.add(numberButs[5]);
keyPanle.add(numberButs[6]);
keyPanle.add(operKeyMap.get("chen"));
keyPanle.add(numberButs[1]);
keyPanle.add(numberButs[2]);
keyPanle.add(numberButs[3]);
keyPanle.add(operKeyMap.get("jian"));
keyPanle.add(numberButs[0]);
keyPanle.add(operKeyMap.get("dian"));
keyPanle.add(operKeyMap.get("jia"));
keyPanle.add(operKeyMap.get("dengyu"));
this.add(clean,BorderLayout.CENTER);
this.add(keyPanle,BorderLayout.SOUTH);
this.setVisible(true);
}
///**
//*注册事件监听
//***/
//privatevoidaddListenerHandler(){
///*主窗体事件处理*/
//this.addWindowListener(newMainWindowListenerImpl());
///*清除按钮事件处理*/
//clean.addMouseListener(newMouseListenerImpl());
//clean.addActionListener(newCleanButtonActionListenerImpl(this));
///*数字键事件处理*/
//for(JButtonnumBut:
numberButs){
//numBut.addMouseListener(newMouseListenerImpl());
//numBut.addActionListener(newNumKeyActionListenerImpl(this));
//}
///*操作键事件处理*/
//CollectionoperButtons=operKeyMap.values();
//for(JButtonoperBut:
operButtons){
//operBut.addMouseListener(newMouseListenerImpl());
//operBut.addActionListener(mOperKeyActionListenerImpl);
//}
//}
//
//privateOperKeyActionListenerImplmOperKeyActionListenerImpl=new
//OperKeyActionListenerImpl(
//this);
/**
*注册事件监听
***/
privatevoidaddListenerHandler(){
/*主窗体事件处理*/
this.addWindowListener(newMainWindowListenerImpl());
/*清除按钮事件处理*/
clean.addMouseListener(newMouseListenerImpl());
clean.addActionListener(newCleanButtonActionListenerImpl(this));
/*数字键事件处理*/
for(JButtonnumBut:
numberButs){
numBut.addMouseListener(newMouseListenerImpl());
numBut.addActionListener(newNumKeyActionListenerImpl(this));
}
/*操作键事件处理*/
Collectio