import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.LinkedList;
import java.text.NumberFormat;
public class ComputerPad extends Frame implements ActionListener
{
NumberButton numberButton[]; //数字按钮数组.
OperationButton operationButton[]; //运算符号按钮数组.
Button 小数点按钮,正负号按钮,退格按钮,求倒数按钮,等号按钮,清零按钮;
Panel panel1; //添加各种按钮的面板.
JTextField resultShow; //显示计算结果的文本条.
String 运算符号[]={"+","-","*","/"};
LinkedList 链表; //负责存储数据的链表.
boolean 是否按下等号=false;
boolean 倒数=false;
public ComputerPad()
{
super("计算器");
链表=new LinkedList();
numberButton=new NumberButton[10];//共有10数字按钮.
for(int i=0;i<=9;i++)
{
numberButton[i]=new NumberButton(i);
numberButton[i].addActionListener(this);
}
operationButton=new OperationButton[4];//共有4个运算符号.
for(int i=0;i<4;i++)
{
operationButton[i]=new OperationButton(运算符号[i]);
operationButton[i].addActionListener(this);
}
小数点按钮=new Button(".");
正负号按钮=new Button(" +/-");
等号按钮=new Button(" =");
求倒数按钮=new Button(" 1/x");
退格按钮=new Button(" 退格");
清零按钮=new Button(" C");
清零按钮.setForeground(Color.red);
退格按钮.setForeground(Color.red);
等号按钮.setForeground(Color.red);
求倒数按钮.setForeground(Color.blue);
正负号按钮.setForeground(Color.blue);
小数点按钮.setForeground(Color.blue);
退格按钮.addActionListener(this);
清零按钮.addActionListener(this);
等号按钮.addActionListener(this);
小数点按钮.addActionListener(this);
正负号按钮.addActionListener(this);
求倒数按钮.addActionListener(this);
resultShow=new JTextField(10);
resultShow.setHorizontalAlignment(JTextField.RIGHT);
resultShow.setForeground(Color.blue);
resultShow.setFont(new Font("TimesRoman",Font.PLAIN,14));
resultShow.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));
resultShow.setBackground(Color.white);
resultShow.setEditable(false);
panel1=new Panel(); //放置按钮的面板容器.
panel1.setLayout(new GridLayout(4,5));
//面板中的第一行:
panel1.add(numberButton[1]);
panel1.add(numberButton[2]);
panel1.add(numberButton[3]);
panel1.add(operationButton[0]);
panel1.add(清零按钮);
//面板中的第二行:
panel1.add(numberButton[4]);
panel1.add(numberButton[5]);
panel1.add(numberButton[6]);
panel1.add(operationButton[1]);
panel1.add(退格按钮);
//面板中的第三行:
panel1.add(numberButton[7]);
panel1.add(numberButton[8]);
panel1.add(numberButton[9]);
panel1.add(operationButton[2]);
panel1.add(求倒数按钮);
//面板中的第四行:
panel1.add(numberButton[0]);
panel1.add(正负号按钮);
panel1.add(小数点按钮);
panel1.add(operationButton[3]);
panel1.add(等号按钮);
add(panel1,BorderLayout.CENTER);
add(resultShow,BorderLayout.NORTH);
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
setVisible(true);
setBounds(100,50,240,180);
setResizable(false);
validate();
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() instanceof NumberButton) //如果鼠标单击数字按钮.
{
NumberButton b=(NumberButton)e.getSource();
if(链表.size()==0)
{
int numb=b.getNumber(); //获取按钮上的数字.
链表.add(""+numb); //将数据添加到链表.
resultShow.setText(""+numb);
是否按下等号=false;
}
else if(链表.size()==1&&倒数==true)
{
int numb=b.getNumber();
链表.removeFirst();
链表.add(""+numb);
倒数=false;
resultShow.setText(""+numb);
}
else if(链表.size()==1&&是否按下等号==false)
{
int numb=b.getNumber();
String num=(String)链表.getFirst();
String s=num.concat(""+numb); //将两个数字首尾相接.
链表.set(0,s);
resultShow.setText(s);
}
else if(链表.size()==1&&是否按下等号==true)
{
int numb=b.getNumber();
链表.removeFirst();
链表.add(""+numb); //将数据添加到链表.
是否按下等号=false;
resultShow.setText(""+numb);
}
else if(链表.size()==2) //链表中已有2个节点.
{
int numb=b.getNumber(); //获取按钮上的数字.
链表.add(""+numb); //链表添加第三个节点,注意第2个节点是运算符号.
resultShow.setText(""+numb);
}
else if(链表.size()==3) //链表中已有3个节点.
{
int numb=b.getNumber();
String num=(String)链表.getLast();
String s=num.concat(""+numb); //与链表第3个节点中的数字首尾相接.
链表.set(2,s);
resultShow.setText(s);
}
}
else if(e.getSource() instanceof OperationButton) //如果单击运算符号按钮.
{
OperationButton b=(OperationButton)e.getSource();
if(链表.size()==1)
{
String fuhao=b.getOperator();
链表.add(fuhao); //链表添加第2个节点:运算符号.
}
else if(链表.size()==2)
{
String fuhao=b.getOperator();
链表.set(1,fuhao); //改变运算符号.
}
else if(链表.size()==3)
{
String fuhao=b.getOperator();
if(是否按下等号==true)
{
链表.removeLast();
链表.set(1,fuhao);
}
else
{
String number1=(String)链表.getFirst();
String number2=(String)链表.getLast();
String 运算符号=(String)链表.get(1);
try
{
double n1=Double.parseDouble(number1);
double n2=Double.parseDouble(number2);
double n=0;
if(运算符号.equals("+"))
{
n=n1+n2;
}
else if(运算符号.equals("-"))
{
n=n1-n2;
}
else if(运算符号.equals("*"))
{
n=n1*n2;
}
else if(运算符号.equals("/"))
{
n=n1/n2;
}
链表.clear(); //根据链表内已有的数据进行运算,其结果作为新的运算数值.
链表.add(""+n);
链表.add(fuhao); //添加下一次计算的运算符.
resultShow.setText(""+n);
}
catch(Exception ee)
{
}
}
}
}
else if(e.getSource()==等号按钮)
{
是否按下等号=true;
if(链表.size()==1||链表.size()==2)
{
String num=(String)链表.getFirst();
resultShow.setText(""+num);
}
else if(链表.size()==3)
{
String number1=(String)链表.getFirst();
String number2=(String)链表.getLast();
String 运算符号=(String)链表.get(1);
try
{
double n1=Double.parseDouble(number1);
double n2=Double.parseDouble(number2);
double n=0;
if(运算符号.equals("+"))
{
n=n1+n2;
}
else if(运算符号.equals("-"))
{
n=n1-n2;
}
else if(运算符号.equals("*"))
{
n=n1*n2;
}
else if(运算符号.equals("/"))
{
n=n1/n2;
}
resultShow.setText(""+n);
链表.set(0,""+n);
//链表.removeLast(); //将链表中第二个运算数删除.
//链表.removeLast(); //再将运算符号删除.
}
catch(Exception ee)
{
}
}
}
else if(e.getSource()==小数点按钮)
{
if(链表.size()==0) //链表中还没有节点.
{
是否按下等号=false;
}
else if(链表.size()==1)
{
String dot=小数点按钮.getLabel(); //获取按钮上的小数点.
String num=(String)链表.getFirst();
String s=null;
if(num.indexOf(dot)==-1) //假如数字中的不含有小数点.
{
s=num.concat(dot);
链表.set(0,s);
}
else //如果数字中已含有小数点.
{
s=num;
}
链表.set(0,s);
resultShow.setText(s);
}
else if(链表.size()==3)
{
String dot=小数点按钮.get
评论0