1.设计内容
设计GUI界面的计算器程序,用户可以通过鼠标依次选择参加计算的数值,然后进行加、减、乘、除等混合运算。
效果如图:计算器界面
2.设计要求:要求GUI界面计算器是一个使用方便的程序,界面要简洁大方,易用性好,能进行加、减、乘、除等混合运算。
3.设计思想
- 搭建界面
- 计算方法是难点。X1 Y X2 Z R(1+1=2)。X1代表第一个操作数,Y代表运算符(初值为0),X2代表第二个操作数,Z代表
- 事件响应分为3大类:
- 第一类数字键,第二类运算符,第三类功能键
- 数字键的处理方法:设定一个变量k=1,如果k=1,表示应该新起一个数字,将这个数字直接添加到文本框tf中,k++。如果k>1,表示这个数字没写完,字符串s获得文本框中的值,连接上点击的按钮数字,再写回文本框tf中。
- 运算符+、-、*、/、=、1/x、-/+、sqrt的处理方法:X2得到tf中的值。G=1代表这些按钮被第一次按下。Y=1,2,3,4代表+-*/运算。如果g==1,说明第一个数结束,将X2的值赋值给X1。如果g>1,说明之前有过操作数,这次是连续运算,因此要将之前的两个数运算后将结果赋值给第一个数,即X1=X1 Y X2。然后Y记录这次的运算符,g++,k=1。Tf文本框显示X1如果是单目运算符,这次计算后就是结果,下次计算不能再次使用本次操作符,所以要g=1。然后X1=X1 Y,Tf文本框显示X1,注意(除法不能除0,开方不能为负,倒数不能为0)
- 功能键的处理方法:“backspace,”将tf文本框中的字符串去掉末尾一位,“CE”,将运算公式全都初始化,运算数清0,“C”,将tf文本框的当前数清0,“小数点”将当前文本框内容连接小数点,k++。
- 窗口关闭处理,响应窗口关闭事件。
话不多说,直接上代码:
package test;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Calculator extends WindowAdapter implements ActionListener{
private Frame f;
private MenuBar mb;
private Menu m1,m2,m3;
private Panel p1,p2,p3,p4,p5;
private TextField tf1,tf2;
private Button b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28;
private double sum0=0,sum1=0;//sum0第一个操作数,sum1第二个操作数,m=1,n=1;
private int i=0,k=1,g=1,n=1;//k=1代表一个数字新开始,g=1代表以前没有按过操作符,i代表操作符1,2,3,4代表+-*/
public void display() {//搭建界面
f=new Frame("计算器");
f.setLayout(new BorderLayout(8,8));
addmyMenu(f); //添加菜单
tf1=new TextField();
f.add(tf1,"North"); //设置计算器文本框在最上方
tf1.setEditable(false);//不允许修改结果文本框
addmyPanel(f); //搭建中间界面
f.setSize(250,250);
f.setLocation(500,50);
f.setBackground(Color.lightGray);
f.addWindowListener(this);
f.setVisible(true);
}
public void addmyMenu(Frame f) { //添加菜单上各种选项
mb=new MenuBar();
f.setMenuBar(mb); //添加菜单条
m1=new Menu("编辑");
m2=new Menu("查看");
m3=new Menu("帮助"); //添加菜单项
mb.add(m1);
mb.add(m2);
mb.add(m3);
m1.add(new MenuItem("复制"));
MenuItem mi=new MenuItem("粘贴");
mi.setEnabled(false); //添加快捷键
m1.add(mi);
m2.add(new MenuItem("标准型"));
m2.add(new MenuItem("科学型"));
m2.addSeparator(); //添加分割线
m2.add(new MenuItem("数字分组"));
m3.add(new MenuItem("帮助主题"));
m3.addSeparator();
m3.add(new MenuItem("关于计算器"));
}
public void addmyPanel(Frame f) { //添加界面上的各种按钮
p1=new Panel();
p1.setLayout(new BorderLayout(8,8)); //8行8列
f.add(p1,"Center");
p2=new Panel();
p2.setLayout(new GridLayout(1,3,5,5)); //中间上行功能键,1行3列
b21=new Button("Backspace");
b21.setForeground(Color.red);
b21.addActionListener(this); //Backspace的事件响应
p2.add(b21);
b22=new Button("CE");
b22.setForeground(Color.red);
b22.addActionListener(this); //CE的事件响应
p2.add(b22);
b23=new Button("C");
b23.setForeground(Color.red);
b23.addActionListener(this); //C的事件响应
p2.add(b23);
p3=new Panel(new GridLayout(6,1,5,5)); //左侧的布局5行1列
p1.add(p3,"West");
tf2=new TextField(2);
tf2.setEditable(true); //允许编辑
p3.add(tf2);
b24=new Button("MC");
b24.setForeground(Color.red); //MC按钮
p3.add(b24);
b25=new Button("MR");
b25.setForeground(Color.red); //MR按钮
p3.add(b25);
b26=new Button("MS");
b26.setForeground(Color.red); //MS按钮
p3.add(b26);
b27=new Button("M+");
b27.setForeground(Color.red); //M+按钮
p3.add(b27);
b28=new Button("M-");
b28.setForeground(Color.red); //M-按钮
p3.add(b28);
p4=new Panel(new GridLayout(4,5,5,5));//具体操作键4行5列
p1.add(p4);
b7=new Button("7");
b7.setForeground(Color.blue);
b7.addActionListener(this);
p4.add(b7); //7
b8=new Button("8");
b8.setForeground(Color.blue);
b8.addActionListener(this);
p4.add(b8); //8
b9=new Button("9");
b9.setForeground(Color.blue);
b9.addActionListener(this);
p4.add(b9); //9
b11=new Button("/");
b11.setForeground(Color.red);
b11.addActionListener(this);
p4.add(b11); // 运算符/法
b12=new Button("sqrt");
b12.setForeground(Color.blue);
b12.addActionListener(this);
p4.add(b12); // 运算符开方
b4=new Button("4");
b4.setForeground(Color.blue);
b4.addActionListener(this);
p4.add(b4); //4
b5=new Button("5");
b5.setForeground(Color.blue);
b5.addActionListener(this);
p4.add(b5); //5
b6=new Button("6");
b6.setForeground(Color.blue);
b6.addActionListener(this);
p4.add(b6); //6
b13=new Button("*");
b13.setForeground(Color.red);
b13.addActionListener(this);
p4.add(b13); //运算符*法
b14=new Button("%");
b14.setForeground(Color.blue);
b14.addActionListener(this);
p4.add(b14); // 运算符%法
b1=new Button("1");
b1.setForeground(Color.blue);
b1.addActionListener(this);
p4.add(b1); //1
b2=new Button("2");
b2.setForeground(Color.blue);
b2.addActionListener(this);
p4.add(b2); //2
b3=new Button("3");
b3.setForeground(Color.blue);
b3.addActionListener(this);
p4.add(b3); //3
b15=new Button("-");
b15.setForeground(Color.red);
b15.addActionListener(this);
p4.add(b15); //运算符-法
b16=new Button("1/x");
b16.setForeground(Color.blue);
b16.addActionListener(this);
p4.add(b16); //运算符到数
b10=new Button("0");
b10.setForeground(Color.blue);
b10.addActionListener(this);
p4.add(b10); //0
b17=new Button("+/-");
b17.setForeground(Color.blue);
b17.addActionListener(this);
p4.add(b17); //取反
b18=new Button(".");
b18.setForeground(Color.blue);
b18.addActionListener(this);
p4.add(b18); //小数点
b19=new Button("+");
b19.setForeground(Color.red);
b19.addActionListener(this);
p4.add(b19); //运算符+法
b20=new Button("=");
b20.setForeground(Color.red);
b20.addActionListener(this);
p4.add(b20); //运算符=
p5=new Panel(new BorderLayout(8,8));
p1.add(p5);
p5.add(p2,"North");
p5.add(p4,"Center"); //搭建中间界面
}
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(b10)||e.getSource().equals(b1)||e.getSource().equals(b2)||e.getSource().equals(b3)||e.getSource().equals(b4)||e.getSource().equals(b5)||e.getSource().equals(b6)||e.getSource().equals(b7)||e.getSource().equals(b8)||e.getSource().equals(b9)) {
String s=e.getActionCommand().trim();//获取数字
if(k==1) {tf1.setText(s);k++;}//将数字直接写到文本框中,k=1代表新开始一个数字
else {tf1.setText(tf1.getText()+s);}//追加到文本框中
}
if(e.getSource().equals(b11)||e.getSource().equals(b13)||e.getSource().equals(b15)||e.getSource().equals(b19)||e.getSource().equals(b12)||e.getSource().equals(b14)||e.getSource().equals(b16)||e.getSource().equals(b17)||e.getSource().equals(b20)) {
String n=e.getActionCommand().trim();
sum1=Double.parseDouble(tf1.getText());
if(g==1) {sum0=sum1;tf1.setText(tf1.getText()+n);}//如果是第一次按下运算符操作键,将获得的数赋给第一个操作数sum0
else {//如果是第二次按运算符,需要先计算上一次结果
if(i==0) {}//i=1,2,3,4代表+,-,*,/
if(i==1) {sum0=sum0+sum1;}
if(i==2) {sum0=sum0-sum1;}
if(i==3) {sum0=sum0*sum1;}
n=String.valueOf(sum0);//结果转化为字符串
if(i==4) {
if(sum1==0) {n="不合法";}
else {sum0=sum0/sum1;n=String.valueOf(sum0);}
}
tf1.setText(n);
}
if(e.getSource().equals(b19)) {i=1;}//+
if(e.getSource().equals(b15)) {i=2;}//-
if(e.getSource().equals(b13)) {i=3;}//*
if(e.getSource().equals(b11)) {i=4;}//'/'
g++;//运算符被按下一次
k=1;//下一个数字重新开始
if(e.getSource().equals(b20)) {g=1;}//等于号,下一次运算重新开始
if(e.getSource().equals(b12)) {//开方
if(sum0<0) {n="不合法";}
else {sum0=Math.sqrt(sum0);n=String.valueOf(sum0);}tf1.setText(n);
}
if(e.getSource().equals(b14)) {//百分号
if(sum0!=0) {sum0=sum0/100;}n=String.valueOf(sum0);tf1.setText(n);
}
if(e.getSource().equals(b16)) {//倒数
if(sum0<0||sum0==0) {n="不合法";}
else {sum0=1/sum0;n=String.valueOf(sum0);}tf1.setText(n);
}
if(e.getSource().equals(b17)) {//取反
if(sum0!=0) {sum0=sum0*(-1);}n=String.valueOf(sum0);tf1.setText(n);
}
}
if(e.getSource().equals(b18)) {//小数点
String r=tf1.getText()+".";
tf1.setText(r);
k++;
}
if(e.getSource().equals(b21)) {//退位键
String t=tf1.getText();
t=t.substring(0,t.length()-1);
tf1.setText(t);
}
if(e.getSource().equals(b22)) {//CE
sum0=0;sum1=0;i=0;g=1;k=1;
tf1.setText("0");
}
if(e.getSource().equals(b23)) {//C
sum1=0;
tf1.setText("0");
}
}
public void windowClosing(WindowEvent e){//响应窗口事件
System.exit(0);//退出系统
}
public static void main(String[] args) {
Calculator j=new Calculator();
j.display();
}
}
另外 储存功能没有做,等以后有机会再详细补全哈