本篇参考了网上两篇资料尤其是栈推
Calculator类
package calframe;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Calculator extends JFrame implements Tetx{
JPanel mianban;//面板
JTextArea text;
JButton j0,j1,j2,j3,j4,j5,j6,j7,j8,j9;
JButton add,sqrt,subtract,mul,div,squ,cos,bot,deng,back,qing,sin,tan,yu;
private Container panel;
public Calculator()
{
this.setLayout(new BorderLayout());
j0=new JButton("0");j1=new JButton("1");j2=new JButton("2");j3=new JButton("3");j4=new JButton("4");
j5=new JButton("5");
j6=new JButton("6");
j7=new JButton("7");
j8=new JButton("8");
j9=new JButton("9");
bot=new JButton(".");
bot.setForeground(Color.red);
sqrt=new JButton("sqrt");
sqrt.setForeground(Color.red);
squ=new JButton("x^2");
yu=new JButton("%");
cos=new JButton("cos");
cos.setForeground(Color.red);
sin=new JButton("sin");
sin.setForeground(Color.green);
tan=new JButton("tan");
tan.setForeground(Color.yellow);
deng=new JButton("=");
add=new JButton("+");
subtract=new JButton("-");
mul=new JButton("*");
div=new JButton("/");
qing=new JButton("c");
qing.setForeground(Color.red);//设置按键颜色
back=new JButton("back");
//定义按钮
text=new JTextArea(2,10);//文本域
mianban=new JPanel();
mianban.setLayout(new GridLayout(6,4));
mianban.add(yu);mianban.add(cos);mianban.add(sin);mianban.add(tan);//面板上端第一行
mianban.add(qing);mianban.add(div);mianban.add(mul);mianban.add(back);//面板上端第二行
mianban.add(j7); mianban.add(j8); mianban.add(j9); mianban.add(subtract);
mianban.add(j4);mianban.add(j5);mianban.add(j6);mianban.add(add);
mianban.add(j1);mianban.add(j2);mianban.add(j3);mianban.add(sqrt);
mianban.add(squ);mianban.add(j0);mianban.add(bot);mianban.add(deng);
this.add(text,BorderLayout.NORTH);//把text放在最上方
this.add(mianban);
setVisible(true);//设置为可设置的
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Event();//不同键触发的事件
}
public void Text(JButton button){
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
String str = button.getText();
text.setText(text.getText()+str);
}
});
}
private void Event() {
Text(j0);Text(j1);Text(j2);Text(j3); Text(j4); Text(j5); Text(j6);Text(j7);Text(j8);Text(j9);
Text(bot);Text(add);Text(subtract);Text(mul); Text(div); Text(yu);//需要显示在文本域的按键
cos.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e) {
String str=text.getText();
double n;
n=Double.parseDouble(str);
n=Math.cos(n*Math.PI/180);
text.setText(""+n);
}
}
);
sin.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) {
String str=text.getText();
double n;
n=Double.parseDouble(str);
n=Math.sin(n*Math.PI/180);
text.setText(""+n);
}
}
);
tan.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) {
String str=text.getText();
double n;
n=Double.parseDouble(str);
n=Math.tan(n*Math.PI/180);
text.setText(""+n);
}
}
);
qing.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0) {
text.setText("");
}
}
);
back.addActionListener(new ActionListener()//往后倒退一格
{
public void actionPerformed(ActionEvent arg0) {
String str=text.getText(),ch;
ch=str.substring(0, str.length()-1);//将其长度减1,即从0开始检索到-1位
text.setText(""+ch);
}
}
);
sqrt.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0) {
String str=text.getText();
double n;
n=Double.parseDouble(str);
n=Math.sqrt(n);//利用函数进行开方
text.setText(""+n);
}
}
);
squ.addActionListener(new ActionListener()
{
//按钮事件
public void actionPerformed(ActionEvent e) {
String str=text.getText();
double n;
n=Double.parseDouble(str);
n*=n;
text.setText(""+n);
}
}
);
deng.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String str=text.getText(),str0="";//利用str字符串存取text1内容
char ch,c;
int i=0,top1=-1,top2=-1,j=-1,flog=0,l,str1[]=new int[120];
double t,suz[]=new double[122],cha,cha1[]=new double[120];
l=str.length();
c=str.charAt(0);
if(c=='-')
{
t=0;
suz[++top1]=t;
}//如果第一个为负号就在前面加0
for( i=0;i<l;i++)
{
ch=str.charAt(i);
if(ch>='0'&&ch<='9'||ch=='.')//先保存一个数字
{
str0=str0+ch;flog=1;//设计flog为1让接下来判断进行存数字
}
else
{
if(flog==1)//把保存的数字字符串转成数字,并放入数字栈中
{
t=Double.parseDouble(str0);
suz[++top1]=t;
flog=0; str0="";//注意初始化
}
if(ch=='+'||ch=='-')//符号的优先级
cha=1;
else
cha=2; //优先级更大
if(top2>=0&&cha1[top2]>=cha)//满足条件时计算,满足此时的优先级大于之前的
{
if(str1[j]==1)
suz[top1-1]=suz[top1]+suz[top1-1];
if(str1[j]==2)
suz[top1-1]=suz[top1-1]-suz[top1];
if(str1[j]==3)
suz[top1-1]=suz[top1]*suz[top1-1];
if(str1[j]==4)
suz[top1-1]=suz[top1-1]/suz[top1];
top2--;top1--;
j--;i--;
}
else
{
cha1[++top2]=cha;//把符号优先级大的放入符号栈中
if(ch=='+')
str1[++j]=1;// 把符号保存在符号栈中,1表示符号为+,下面同理
if(ch=='-')
str1[++j]=2;
if(ch=='*')
str1[++j]=3;
if(ch=='/')
str1[++j]=4;
if(ch=='%')
str1[++j]=5;
}
}
}
t=Double.parseDouble(str0);//最后一个是数字
++top1;suz[top1]=t;
for(;j>=0;j--)//计算最后的结果
{
if(str1[j]==1)
suz[top1-1]=suz[top1]+suz[top1-1];
if(str1[j]==2)
suz[top1-1]=suz[top1-1]-suz[top1];
if(str1[j]==3)
suz[top1-1]=suz[top1]*suz[top1-1];
if(str1[j]==4)
suz[top1-1]=suz[top1-1]/suz[top1];
if(str1[j]==5)
suz[top1-1]=suz[top1-1]%suz[top1];
top1--;
}
text.setText(""+suz[0]);
}
}
);
}
}
Main类可以自由定义
package calframe;
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Calculator Calculator = new Calculator();
Calculator.setBounds(400, 300, 500, 400);
Calculator.setTitle("XXX的计算器");
}
}