Java实验四GUI简易计算器.docx
《Java实验四GUI简易计算器.docx》由会员分享,可在线阅读,更多相关《Java实验四GUI简易计算器.docx(19页珍藏版)》请在冰豆网上搜索。
Java实验四GUI简易计算器
实验四GUI图形界面设计
一实验要求
1、掌握Awt与Swing的区别与联系;掌握Swing常用图像组件的使用;掌握主要的布局管理器的使用方法;
2、了解事件处理机制;掌握Swing常用图像组件的使用;掌握固定菜单和弹出式菜单的创建和使用;
二实验内容
1、设计并实现一个类似于windows操作系统附件中自带的计算器的一款简单的计算器,要求界面美观,设计合理;带有常用的菜单并实现其功能;能完成加、减、乘、除等简单的计算,在下面写出其核心代码。
(1)源代码
packagecom.cal;
importjava。
awt。
*;
importjavax。
swing。
*;
importjava。
awt。
event。
*;
importjava。
util。
Stack;
importjava.awt。
GridLayout;
classCalextendsJFrameimplementsActionListener{
JTextFieldshow=null;
JPaneljp1,jp2;
JButtonc,jia,jian,cheng,chu,equ,point;
//按钮清空加,减,乘,除,等号,小数点
JButtonb[]=newJButton[10];//按钮数组0-9
//栈控制标记位
intflag=1;
//结果标记位
intreflag=0;
publicCal()
{
//创建组件
jp1=newJPanel();
jp2=newJPanel();
show=newJTextField(45);
show.setFont(newFont(”宋体",Font。
PLAIN,16));
jia=newJButton(”+");
jian=newJButton(”—”);
cheng=newJButton(”*”);
chu=newJButton(”/");
equ=newJButton(”=”);
equ。
setForeground(Color.RED);
equ.setBackground(Color.GREEN);
point=newJButton("。
”);
b[0]=newJButton(”0");
b[1]=newJButton("1”);
b[2]=newJButton(”2");
b[3]=newJButton(”3”);
b[4]=newJButton("4”);
b[5]=newJButton("5”);
b[6]=newJButton(”6”);
b[7]=newJButton(”7”);
b[8]=newJButton("8");
b[9]=newJButton(”9”);
c=newJButton(”C”);
c。
setForeground(Color.RED);
c。
setBackground(Color.YELLOW);
c。
setFont(newFont("黑体",Font.PLAIN,15));
//添加组件
jp1。
add(show);
jp1。
add(c);
//show.setEditable(false);
jp2。
add(b[7]);
jp2.add(b[8]);
jp2。
add(b[9]);
jp2.add(jia);
jp2。
add(b[4]);
jp2.add(b[5]);
jp2.add(b[6]);
jp2.add(jian);
jp2。
add(b[1]);
jp2。
add(b[2]);
jp2.add(b[3]);
jp2.add(cheng);
jp2.add(equ);
jp2.add(b[0]);
jp2。
add(point);
jp2。
add(chu);
jp2.setLayout(newGridLayout(4,4,3,3));
//注册监听
show.addActionListener(this);
jia.addActionListener(this);
jian。
addActionListener(this);
cheng.addActionListener(this);
chu.addActionListener(this);
equ。
addActionListener(this);
point.addActionListener(this);
c。
addActionListener(this);
for(inti=0;i<10;i++)
{
b[i].addActionListener(this);
}
//设置布局管理器
this.add(jp1,BorderLayout。
NORTH);
this。
add(jp2);
//设置窗体属性
this.setTitle("简易计算器");
this.setSize(500,300);
this。
setLocation(500,200);
this。
setDefaultCloseOperation(JFrame。
EXIT_ON_CLOSE);
//显示窗体
this.setVisible(true);
}
@Override
publicvoidactionPerformed(ActionEvente)
{
if(reflag==1&&e.getSource()!
=equ)
show.setText("");
if(e。
getSource()==b[0])
{
show.setText(show。
getText()+”0");
flag=0;
reflag=0;
}elseif(e.getSource()==b[1])
{
show.setText(show。
getText()+”1");
flag=0;
reflag=0;
}elseif(e。
getSource()==b[2])
{
show。
setText(show。
getText()+”2”);
flag=0;
reflag=0;
}elseif(e。
getSource()==b[3])
{
show.setText(show。
getText()+”3");
flag=0;
reflag=0;
}elseif(e。
getSource()==b[4])
{
show.setText(show.getText()+”4");
flag=0;
reflag=0;
}elseif(e.getSource()==b[5])
{
show.setText(show。
getText()+"5");
flag=0;
reflag=0;
}elseif(e.getSource()==b[6])
{
show。
setText(show.getText()+”6");
flag=0;
reflag=0;
}elseif(e。
getSource()==b[7])
{
show。
setText(show。
getText()+”7");
flag=0;
reflag=0;
}elseif(e。
getSource()==b[8])
{
show.setText(show。
getText()+”8");
flag=0;
reflag=0;
}elseif(e。
getSource()==b[9])
{
show。
setText(show.getText()+”9");
flag=0;
reflag=0;
}
//操作符处理
elseif(e。
getSource()==jia)
{
show。
setText(show。
getText()+”+”);
flag=1;
reflag=0;
}elseif(e。
getSource()==jian)
{
show.setText(show。
getText()+"—”);
flag=1;
reflag=0;
}elseif(e.getSource()==cheng)
{
show。
setText(show。
getText()+”*");
flag=1;
reflag=0;
}elseif(e.getSource()==chu)
{
show.setText(show。
getText()+"/");
flag=1;
reflag=0;
}elseif(e.getSource()==point){//小数点只能按一次
show.setText(show.getText()+”.”);
flag=1;
reflag=0;
}
elseif(e.getSource()==c){
show。
setText(””);
flag=1;
reflag=0;
}
//计算结果并输出
else{
Strings=show.getText();
if(s。
charAt(s。
length()-1)=='/'||s。
charAt(s。
length()—1)=='*’||
s.charAt(s.length()—1)==’+’||s。
charAt(s。
length()-1)=='—')
show。
setText("符号不能放最后");
elseif(s。
charAt(s.length()-1)==’.'&&s。
charAt(s.length()—2)=='.')
show.setText(”pointsareboom");
else
show.setText(”=”+SetSum(s));
reflag=1;
flag=1;
}
}
privatedoubleSetSum(Stringst)
{
if(st。
trim()=="")return0;
//实例化用来存放操作数和操作符的栈并清空
Stack〈Object>SNum=newStack();
Stack〈Object〉SOp=newStack();
SNum。
removeAllElements();
SOp。
removeAllElements();
StringSnum=”";
doubleInum=0;
chara1=st.charAt((st.length()—1));
charb1=st。
charAt((st.length()-2));
for(inti=0;i〈st.length();i++)
{
charc=st。
charAt(i);
if(c=='+’||c==’—’)
{
Inum=Double。
parseDouble(Snum);
if(SOp。
empty())
SNum。
push(Inum);
else
{
switch((char)SOp。
peek())
{
case'+':
SNum。
push((double)SNum.pop()+Inum);
SOp。
pop();
break;
case'-’:
SNum。
push((double)SNum。
pop()—Inum);
SOp。
pop();
break;
case'*’:
SNum。
push((double)SNum。
pop()*Inum);
SOp.pop();
break;
case’/’:
SNum.push((double)SNum.pop()/Inum);
SOp.pop();
break;
}
}
//将符号压入栈
switch(c)
{
case’+’:
SOp。
push(’+’);
break;
case’-':
SOp。
push('-');
break;
}
Snum=””;
}
elseif(c=='*'||c=='/')
{
Inum=Double。
parseDouble(Snum);
if(SOp.empty())
SNum。
push(Inum);
else{
if(a1==’0'&&b1==’.’){//如果是整数,则去掉后面的小数点和0
show。
setText(String。
valueOf(Math.round(Inum)));
}
switch((char)SOp。
peek())
{
case’*’:
SNum。
push((double)SNum.pop()*Inum);
SOp.pop();
break;
case’/':
SNum.push((double)SNum。
pop()*Inum);
SOp。
pop();
break;
default:
SNum.push(Inum);
break;
}
}
//将符号压入符号栈
switch(c)
{
case'*’:
SOp。
push('*');
break;
case'/’:
SOp。
push('/’);
break;
}
Snum=””;
}
else
{
Snum=Snum+c;
}
}
SNum.push(Double。
parseDouble(Snum));//将表达式最后一个数入栈
doublea,b;
while(!
SOp.empty())
{
a=(double)SNum。
pop();
b=(double)SNum.pop();
switch((char)SOp。
pop())
{
case’+’:
SNum。
push(b+a);
break;
case’-’:
SNum。
push(b—a);
break;
case'*':
SNum.push(b*a);
break;
case’/’:
SNum.push(b/a);
break;
}
}
return(double)SNum.pop();
}
}
publicclassCalculter{
publicstaticvoidmain(String[]args){
//TODO自动生成的方法存根
Calcal=newCal();
}
}
(2)截图
加
乘
清除
小数
三实验内容中遇到的问题、解决方法和体会。
遇到的问题:
1.String如何转为double类型
2.栈的使用
3.符号放到最后出错
4.连续输入小数点出错
5.如何实现小数的运算
6.Exceptioninthread”AWT—EventQueue-0”java.lang.StringIndexOutOfBoundsException:
Stringindexoutofrange:
—1
java。
lang。
NumberFormatException
解决方法:
1。
Inum=Double。
parseDouble(Snum);
2。
查询Java开发文档解决.
3.输出错误信息
4。
输出错误信息
5。
chara1=st。
charAt((st。
length()—1));
charb1=st。
charAt((st.length()-2));
if(a1==’0’&&b1=='。
’){show。
setText(String.valueOf(Math.round(Inum)));
}
6.不直接按等于号
体会
这个实验是一个很综合的实验,需要用到GUI,事件监听,和栈涉及到很多的知识,自己也有很多不会的内容,做这个实验很考验自己的耐性,和信心,以及查阅信息的能力。
但最总的结果是好的,做出来很开心。