📄 jisuanqi.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.LinkedList;
import java.text.NumberFormat;
public class JiSuanQi extends Frame implements ActionListener
{
NumberButton NumberButton[]; //数字按钮数组
OperationButton OperationButton[]; //运算符号数组
Button 小数点,正负号,退格,倒数,等号,清零;
Panel panel; //添加按钮的面板
JTextField resultshow; //显示结果的编辑框
String 运算符号[]={"+","-","*","/","sin","cos","tan","sqrt"};
LinkedList 存储链表; //存储数据的链表
boolean 按下等号;
public JiSuanQi()
{
super(" 计算器 ");
存储链表=new LinkedList();
NumberButton=new NumberButton[10]; //共有10个按钮(0-9)
for(int i=0;i<=9;i++)
{
NumberButton[i]=new NumberButton(i);
NumberButton[i].addActionListener(this);
}
OperationButton=new OperationButton[8]; //共有8个运算符号,见上面的数组(运算符号[])
for(int i=0;i<8;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);
panel=new Panel();
panel.setLayout(new GridLayout(4,5));
//面板中的第一行
panel.add(NumberButton[1]);
panel.add(NumberButton[2]);
panel.add(NumberButton[3]);
panel.add(OperationButton[0]);
panel.add(OperationButton[4]);
panel.add(清零);
//面板中第二行
panel.add(NumberButton[4]);
panel.add(NumberButton[5]);
panel.add(NumberButton[6]);
panel.add(OperationButton[1]);
panel.add(OperationButton[5]);
panel.add(退格);
//面板中第三行
panel.add(NumberButton[7]);
panel.add(NumberButton[8]);
panel.add(NumberButton[9]);
panel.add(OperationButton[2]);
panel.add(OperationButton[6]);
panel.add(倒数);
//面板中第四行
panel.add(NumberButton[0]);
panel.add(正负号);
panel.add(小数点);
panel.add(OperationButton[3]);
panel.add(OperationButton[7]);
panel.add(等号);
this.add(panel,BorderLayout.CENTER);
this.add(resultshow,BorderLayout.NORTH);
this.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)
//获得鼠标单击数字按钮,鼠标单击数字后,链表节点变为1或3,
//当节点为3时,其中节点为2的数据必为运算符号
{
if(!(resultshow.getText().equals("除数不能为零。")))
{
NumberButton b=(NumberButton)e.getSource();
int number=b.getNumber(); //获取按钮上的数字
if(存储链表.size()==0) //如果链表中没有节点
{
按下等号=false;
存储链表.add(""+number); //向链表添加数据,增加一次节点就相对也增一
resultshow.setText(""+number);
}
else if((存储链表.size()==1 && 按下等号==false) || 存储链表.size()==3)
{
String num=null;
String s=null;
if(存储链表.size()==1)
{
num=(String)存储链表.getFirst();
}
else
{
num=(String)存储链表.getLast();
}
if(num.equals("0"))
{
s=""+number;
}
else
{
s=num.concat(""+number);
}
存储链表.set(存储链表.size()-1,s);
resultshow.setText(s);
}
else if(存储链表.size()==1 && 按下等号==true)
{
按下等号=false;
存储链表.removeFirst();
存储链表.add(""+number);
resultshow.setText(""+number);
}
else if(存储链表.size()==2)
{
存储链表.add(""+number);
resultshow.setText(""+number);
}
}
}
else if(e.getSource() instanceof OperationButton)
//获得鼠标单击符号按钮,鼠标单击符号后,链表节点变为1或2,
//当节点为2时,其中节点为2的数据必为运算符号而且必是(+ , - , * , /)其中之一
{
OperationButton b=(OperationButton)e.getSource();
if(存储链表.size()==1 || 存储链表.size()==2)
{
String label=b.getOperator();
if(label.equals("sin"))
{
按下等号=true;
double result=Math.sin(Double.parseDouble((String)存储链表.getFirst()));
存储链表.clear();
存储链表.add(""+result);
resultshow.setText(""+result);
}
else if(label.equals("cos"))
{
按下等号=true;
double result=Math.cos(Double.parseDouble((String)存储链表.getFirst()));
存储链表.clear();
存储链表.add(""+result);
resultshow.setText(""+result);
}
else if(label.equals("tan"))
{
按下等号=true;
double result=Math.tan(Double.parseDouble((String)存储链表.getFirst()));
存储链表.clear();
存储链表.add(""+result);
resultshow.setText(""+result);
}
else if(label.equals("sqrt"))
{
按下等号=true;
double result=Math.sqrt(Double.parseDouble((String)存储链表.getFirst()));
存储链表.clear();
存储链表.add(""+result);
resultshow.setText(""+result);
}
else
{
if(存储链表.size()==1)
{
存储链表.add(label);
}
else
{
存储链表.set(1,label);
}
}
}
else if(存储链表.size()==3)
{
String label=b.getOperator();
String num1=(String)存储链表.getFirst();
String num2=(String)存储链表.getLast();
String sign=(String)存储链表.get(1);
try
{
double number1=Double.parseDouble(num1);
double number2=Double.parseDouble(num2);
double result=0;
if(label.equals("sin"))
{
按下等号=true;
result=Math.sin(number2);
存储链表.set(2,""+result);
resultshow.setText(""+result);
}
else if(label.equals("cos"))
{
按下等号=true;
result=Math.cos(number2);
存储链表.set(2,""+result);
resultshow.setText(""+result);
}
else if(label.equals("tan"))
{
按下等号=true;
result=Math.tan(number2);
存储链表.set(2,""+result);
resultshow.setText(""+result);
}
else if(label.equals("sqrt"))
{
按下等号=true;
result=Math.sqrt(number2);
存储链表.set(2,""+result);
resultshow.setText(""+result);
}
else
{
result=result(sign,number1,number2,result);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -