java 线性计算器_Java 简易计算器

这是一个使用Java编写的简易计算器程序,它实现了基本的数学运算包括加、减、乘、除,并具有清除、退格和等于功能。程序通过GridBagLayout进行界面布局,使用Stack进行计算操作。
摘要由CSDN通过智能技术生成

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的对象

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值