//如下先实现计算器的外壳
效果图:
package Experiment;
import java.awt.*;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Calculator extends JFrame {
//创建10个按钮对象,赋值0-9
JButton []b=new JButton[10];{
for(int i=0;i<b.length;i++)
b[i]=new JButton(""+i);
}
//创建运算符按钮
JButton b00=new JButton("."),bplus=new JButton("+"),
bminute=new JButton("-"),
bmulti=new JButton("*"),
bdivide=new JButton("/"),
bequal=new JButton("=");
//创建文本域,默认值为0.
JTextField jtf=new JTextField("0.");
//创建面板
JPanel jp=new JPanel();
//无参的构造方法
public Calculator(){
//面板使用网格布局
jp.setLayout(new GridLayout(4,4,5,5));
//将各个按钮依次加入面板
jp.add(b[7]);jp.add(b[8]);jp.add(b[9]);jp.add(bdivide);jp.add(b[4]);jp.add(b[5]);jp.add(b[6]);jp.add(bmulti);
jp.add(b[1]);jp.add(b[2]);jp.add(b[3]);jp.add(bminute);
jp.add(b[0]);jp.add(b00);jp.add(bequal);jp.add(bplus);
//文本域向右对齐
jtf.setHorizontalAlignment(JTextField.RIGHT);//将文本域置顶,面板添加在中间,JFrame默认使用的是BorderLayout布局
add(jtf,BorderLayout.NORTH);
add(jp,BorderLayout.CENTER);
//注册监视器,并为每个按钮注册监听
ButtonClickListener listener=new ButtonClickListener();
for(int i=0;i<10;i++){
b[i].addActionListener(listener);
}
b00.addActionListener(listener);
bplus.addActionListener(listener);
bminute.addActionListener(listener);
bmulti.addActionListener(listener);
bdivide.addActionListener(listener);
bequal.addActionListener(listener);
setSize(250,180);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
//监听器的实现
public class ButtonClickListener implements ActionListener{
//c创建一个空的文本对象
JTextField jf=null;
//创建一个StringBuffer对象
StringBuffer sb=new StringBuffer();
//自定义一个类Calculate,在这个类中实现具体的算法,此处创建这个类的对象
Calculate cal=new Calculate();public void actionPerformed(ActionEvent e) {
//使用e.getActionCommand()获取点击按钮内的内容
String command=e.getActionCommand();switch(command) {
case "1":
case "2":
case "3":
case "4":
case "5":
case "6":
case "7":
case "8":
case "9":
case "0":
case ".":
case "+":
case "-":
case "*":
case "/":
case "%":
sb.append(command); //每次点击都将获取的内容加入到StringBuffer内
jtf.setText(sb.toString().trim());//将StringBuffer里的内容转为string类型,在文本域内显示
break;
case "=":
Double a=cal.calulate(sb); //接受Calculate返回的值
jtf.setText(String.valueOf(a));//将Double类型的a转为string类型,显示在文本域
}
}
}
public static void main(String[] args) {
try{
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
}catch(Exception e){}
new Calculator();
}
}
//计算类的实现
package Experiment;
import java.util.*;
import javax.swing.JTextField;
//定义一个有返回值的有参方法,将从按钮类获取的计算表达式传入
public Double calulate(StringBuffer str) {
String string=null; //定义一个String类型的对象
String content=str.toString().trim();//将参数str转为string类型(表达式如:"3*4-1/2")List charlist=new ArrayList(); //定义集合charlist和intlist分别储存计算表达式的运算符和数字
List intlist=new ArrayList();
//将字符串转化为数组
char[] ch=content.toCharArray(); //将表达式转为字符型,定义字符数组接受每个字符(如:3+42将被拆成3,+,4,2)
//将四则运算符和数字分别加入集合charlist和intlist
for(int i=0;i<ch.length;i++) {
//如何ch[i]是运算符则直接加入到charlist集合中
if(ch[i]=='+'||ch[i]=='-'||ch[i]=='*'||ch[i]=='/') {charlist.add(ch[i]);
}
else {
string=String.valueOf(ch[i]); //将字符型为数字的转为字符串类型
if(i+1>=ch.length) { //如果i+1大于等于字符数组长度,即ch[i]已经是最后一个字符,将string
//类型转为Double类型传入集合intlist
intlist.add(Double.valueOf(string));}else {
//如果ch[i]不是最后一个字符,则判断下一个字符是否还是数字,如果是就将它拼接到string里,然后转为Double类型转入集合
while(ch[i+1]!='+'&&ch[i+1]!='-'&&ch[i+1]!='*'&&ch[i+1]!='/') {String z=String.valueOf(ch[i+1]);
string=string.concat(z);
if(i+1<ch.length) {
i++;
if(i+1>=ch.length) {
break;
}
}
}
intlist.add(Double.valueOf(string));
}
}
}
//计算乘除,然后将结果返回集合intlist中,集合charlist中的乘除则移动
for(int i=0;i<charlist.size();i++) {
char c=(char)charlist.get(i);
if(c=='*'||c=='/') {
charlist.remove(i);
String s=intlist.get(i).toString();
Double left=Double.valueOf(s);
String z=intlist.get(i+1).toString();
Double right=Double.valueOf(z);
if(c=='*') {
intlist.set(i,left*right);
intlist.remove(i+1);
}else {
intlist.set(i,left/right);
intlist.remove(i+1);
}
//*或/运算已被移除,故集合中的数向前进一步,为保证下一位不被跳过,故i--
i--;
}
}
//当移除了charlist里面的乘除后如果还有不为空,则一定为加减字符,以下为计算加减的方法
while(!charlist.isEmpty()) {
char o=(char)charlist.remove(0);
String s=intlist.remove(0).toString();
Double le=Double.valueOf(s);
Double left=le;
String d=intlist.remove(0).toString();
Double ri=Double.valueOf(d);
Double right=ri;
if(o=='+') {
intlist.add(0,left+right);
}else {
intlist.add(0,left-right);
}
}
//计算完毕后,intlist内只剩下一个数字,即为最后结果,将结果转为字符串类型,再转为Double类型返回
String a=intlist.get(0).toString();
Double b=Double.valueOf(a);
return b;
}
}
第一次做,如果有什么可以改进的还望告知。