import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Calculator extends JFrame implements ActionListener
{
JFrame f=new JFrame("简易计算器");
String[] a={"C","/","*","B",
"7","8","9","-",
"4","5","6","+",
"1","2","3","=",
"0","."};//将18个按键存入字符串组
JButton[] b=new JButton[18];
JTextField tf=new JTextField("0",15);//设置文本框初始化为0,长度为15
String s=" ";
public Calculator()
{
tf.setEnabled(false);//设置文本框不可编辑
tf.setHorizontalAlignment(JTextField.RIGHT);//设置文本框右对齐
tf.setFont(tf.getFont().deriveFont((float)(40)));//设置文本框字体及字体大小
GridBagLayout g=new GridBagLayout();
GridBagConstraints gb=new GridBagConstraints();//使用网格包布局管理器
JPanel p=new JPanel(g);
for(int i=0;i<18;i++)
{
b[i]=new JButton(a[i]);//将按钮对应字符串
b[i].setFont(new Font("华文细黑",Font.BOLD,30));//设置按键字体及字体大小
b[i].addActionListener(this);//为按钮添加事件监听
}
gb.fill=GridBagConstraints.BOTH;//设置组件完全填满其显示区域。
for(int j=0;j<15;j+=4)
{
gb.gridwidth=1;//水平方向占1单元格
gb.weightx=1;//组件水平大小变化的增量值为1
for(int i=j;i
{
g.setConstraints(b[i],gb);//设置b[0]、b[1]、b[2]、b[4]、b[5]、b[6]、b[8]、b[9]、b[10]、b[12]、b[13]、b[14]使用这种格式(gridwidth=1,weightx=1)
p.add(b[i]);//放入容器
}
if(j==12)
break;
gb.gridwidth=GridBagConstraints.REMAINDER;//占完所在行余下所有单元格(水平方向最后一个组件)
g.setConstraints(b[j+3],gb);//设置b[3]、b[7]、b[11]使用这种格式(gridwidth=GridBagConstraints.REMAINDER)
p.add(b[j+3]);//放入容器
}
gb.weighty=1;//组件垂直大小变化的增量值为1
gb.gridheight=2;//垂直方向占2单元格
g.setConstraints(b[15],gb);//设置b[15]使用这种格式(gridheight=2,weighty=1)
p.add(b[15]);
gb.weighty=0;//组件垂直大小不变化
gb.gridwidth=2;//水平方向占2单元格
gb.gridy=4;
gb.gridx=0;//组件在网格中坐标为(0,4)
g.setConstraints(b[16],gb);//设置b[16]使用这种格式
p.add(b[16]);
gb.gridx=2;//组件在网格中坐标为(2,4)
gb.gridwidth=1;//水平方向占1单元格
g.setConstraints(b[17],gb);//设置b[17]使用这种格式
p.add(b[17]);
b[15].setBackground(Color.red);//设置按钮b[15]背景为红色
f.add(p);//将容器放入窗体
f.add(tf,BorderLayout.NORTH);//将文本框以边界布局上部放入窗体
f.pack();//自动设置窗体大小
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体默认关闭
f.setVisible(true);//设置窗体可见
}
public void actionPerformed(ActionEvent e)//重写按钮事件监听方法
{
String o=e.getActionCommand();//获得点击的按钮的字符串
boolean n=true;
if(o.equals("+")||o.equals("-")||o.equals("*")||o.equals("/"))
s+=" "+o+" ";//在加减乘除前后放置空格
else if(o.equals("C"))
s=" ";//初始化字符串为空格
else if(o.equals("B"))
{
char i=s.charAt(s.length()-2);//提取字符串倒数第二个字符
if(i=='+'||i=='-'||i=='*'||i=='/')
s=s.substring(0,s.length()-3);//若字符是加减乘除,则退3格
else
s=s.substring(0,s.length()-1);//若不是,退1格
}
else if(o.equals("="))
{
s+=o+calculate(s);//调用calculate()方法计算字符串,并将结果添加至原字符串
tf.setText(s);//使用文本框显示字符串
s=" ";//初始化字符串为空格
n=false;
}
else
s+=o;
if(n)
tf.setText(s);//输入'='前也在文本框中显示字符串
}
public String calculate(String t)//构造calculate()方法计算字符串
{
String[] a=t.split(" ");//以空格分割字符串并放入字符串组
Stack b=new Stack();//使用栈存放算数和结果
b.push(Double.parseDouble(a[1]));//将字符串a[1]转换为双精度型(第一个数)并放入栈中
for(int i=2;i
if(i%2==0)//若i是偶数,则a[i]为加减乘除
{
if(a[i].equals("+"))
b.push(Double.parseDouble(a[i+1]));//将字符串a[i+1]转换为双精度型(加减乘除后一个数)并放入栈中
if(a[i].equals("-"))
b.push(-Double.parseDouble(a[i+1]));//负数化
if(a[i].equals("*"))
{
double x=b.pop();//提取栈顶元素(乘除前一个数)
double y=Double.parseDouble(a[i+1]);//将字符串a[i+1]转换为双精度型(乘除后一个数)
b.push(x*y);//将相乘除的结果放入栈中
}
if(a[i].equals("/"))
{
double x=b.pop();
double y=Double.parseDouble(a[i+1]);
b.push(x/y);
}
}
double m=0;
while(!b.isEmpty())
m+=b.pop();//提取栈顶元素并相加
return String.valueOf(m);将双精度型m转化为字符串型并返回
}
public static void main(String[] args)
{
new Calculator();//在main()方法中创建类Calculator的对象
}
}