计算器.docx
《计算器.docx》由会员分享,可在线阅读,更多相关《计算器.docx(13页珍藏版)》请在冰豆网上搜索。
![计算器.docx](https://file1.bdocx.com/fileroot1/2022-12/30/5ab10874-bc46-4d1a-9770-0229e0d7adb8/5ab10874-bc46-4d1a-9770-0229e0d7adb81.gif)
计算器
packageExample01;
importjava.awt.*;
importjava.awt.event.*;
importjava.awt.GridBagConstraints.*;
importjavax.swing.*;
importjava.util.regex.*;
importjava.math.BigDecimal;
importjava.math.MathContext;
importjava.math.RoundingMode;
importjava.util.Stack;
publicclassExample01extendsJFrameimplementsActionListener
{
staticJDialogdig=newJDialog();
staticJDialogdig1=newJDialog();
staticExample01f=newExample01();
staticJTextFieldt=newJTextField();
staticJButton[]b=newJButton[10];
staticJButtonbt1,bt2,bt3,bt4,bt5,bt6,bt7,bt8,bt9,bt10,bt11,bt12;
privateStacknumbers=newStack();
privateStackchs=newStack();
publicstaticvoidmain(String[]args)
{
JTextAreajta,jta1;
JPanelp1,p2;
JMenuBarm;
JMenume1,me2;
f.setTitle("计算器");
f.setSize(350,350);
f.setLocation(200,140);
f.setLayout(newGridBagLayout());//设置为网格包布局
GridBagConstraintsgbc=newGridBagConstraints();//创建网格包约束条件
gbc.fill=GridBagConstraints.BOTH;//设置组件具有的填充模式为both
gbc.anchor=GridBagConstraints.CENTER;//设置当组件小于显示区域时,居中显示;
Containerconta=f.getContentPane();//初始化容器获取窗口f的内容窗格
Containerconta1=dig.getContentPane();//初始化容器
dig.setTitle("关于计算器");
dig.setBounds(200,200,350,150);
jta=newJTextArea();
jta.setBounds(0,0,350,150);
dig.add(jta);
jta.setLineWrap(true);
jta.setEditable(false);
jta.setFont(newFont("宋体",Font.BOLD+Font.ITALIC,20));
jta.setText("此计算器可用于一些简单的计算,比如加减乘除,求倒数,开方等等");
jta.setForeground(Color.red);
dig1.setTitle("提示");
dig1.setBounds(200,200,200,150);
jta=newJTextArea();
jta.setBounds(0,0,200,150);
dig1.add(jta);
jta.setLineWrap(true);
jta.setEditable(false);
jta.setFont(newFont("宋体",Font.BOLD+Font.ITALIC,20));
jta.setText("开方数不能为负数");
jta.setForeground(Color.red);
m=newJMenuBar();//创建一个菜单栏
me1=newJMenu("文件");
me2=newJMenu("帮助");
m.add(me1);
m.add(me2);
me1.add(newJMenuItem("打开"));
me1.addSeparator();
me1.add(newJMenuItem("保存"));
me1.addSeparator();//加入分隔线;
JMenuItemexitItem=newJMenuItem("退出");
exitItem.addActionListener(f);
me1.add(exitItem);
JMenuItemabout=newJMenuItem("关于计算器");
about.addActionListener(f);
me2.add(about);
for(inti=0;i{
b[i]=newJButton(""+i);
b[i].setFont(newFont("",Font.BOLD,16));
b[i].addActionListener(f);
}
bt1=newJButton("Back");
bt2=newJButton("C");
bt3=newJButton("/");
bt4=newJButton("*");
bt5=newJButton("+");
bt6=newJButton("-");
bt7=newJButton("=");
bt8=newJButton(".");
bt9=newJButton("sqrt");
bt10=newJButton("%");
bt11=newJButton("1/x");
bt12=newJButton("+/-");
JButtonb1[]={bt1,bt2,bt3,bt4,bt5,bt6,bt7,bt8,bt9,bt10,bt11,bt12};
for(inti=0;i<12;i++)
{
b1[i].setFont(newFont("",Font.BOLD,16));
b1[i].addActionListener(f);
}
p1=newJPanel();
p1.setLayout(newGridLayout(1,2));
p1.add(bt1);
p1.add(bt2);
p2=newJPanel();
p2.setLayout(newGridLayout(5,4));
p2.add(b[7]);
p2.add(b[8]);
p2.add(b[9]);
p2.add(bt3);
p2.add(b[4]);
p2.add(b[5]);
p2.add(b[6]);
p2.add(bt4);
p2.add(b[1]);
p2.add(b[2]);
p2.add(b[3]);
p2.add(bt5);
p2.add(b[0]);
p2.add(bt12);
p2.add(bt8);
p2.add(bt6);
p2.add(bt11);
p2.add(bt10);
p2.add(bt9);
p2.add(bt7);
f.addCom(m,conta,gbc,0,0,1,1,1,1);
f.addCom(t,conta,gbc,1,0,1,0,1,1);
f.addCom(p1,conta,gbc,2,0,1,0,1,1);
f.addCom(p2,conta,gbc,3,0,5,4,1,5);
t.setHorizontalAlignment(JTextField.LEFT);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
privatevoidaddCom(Componentc,Containercon,GridBagConstraintsgbc,introw,intcol,intnuRow
intnuCol,intweightx,intweighty)//自定义方法
{
gbc.gridx=col;
gbc.gridy=row;
gbc.gridwidth=nuCol;
gbc.gridheight=nuRow;
gbc.weightx=weightx;
gbc.weighty=weighty;
con.add(c,gbc);
}
privatebooleancompare(charstr)
{
if(chs.empty())
{//栈为空时优先级最低返回高
returntrue;
}
charlast=(char)chs.lastElement();
switch(str)
{
case'*':
{
if(last=='+'||last=='-')
returntrue;
else
returnfalse;
}
case'/':
{
if(last=='+'||last=='-')
returntrue;
else
returnfalse;
}
case'%':
{
if(last=='+'||last=='-')
returntrue;
else
returnfalse;
}
case'+':
returnfalse;
case'-':
returnfalse;
}
returntrue;
}
publicBigDecimalcalculate(Stringstr)
{
StringBuffersb=newStringBuffer(str);
StringBuffernum=newStringBuffer();
Stringtem=null;
charnext;
//privatebooleanisNum(Stringnum)
//{
//returnnum.matches("[0-9]");
//}
while(sb.length()>0)
{
tem=sb.substring(0,1);//取第一位字符
sb.delete(0,1);//去掉一位
if(isNum(tem)==true||tem.matches("\\.")==true)
{
num.append(tem);//如果是数字就将其放入num当中
}
else//取得字符不是数据是,则认为num放置的是一个完整的数字,
{//比如123+2,123就被认为是一个完整的数
if(num.length()>0&&!
"".equals(num.toString()))
{
BigDecimalbd=newBigDecimal(num.toString());//将num转换成BigDeciamal类型的数据
numbers.push(bd);//将其放入栈中
num.delete(0,num.length());//将num清空,等待放入新值
}
if(!
chs.isEmpty())
{
while(compare(tem.charAt(0))==false)
{//当当前的运算符优先级等于或小于栈顶运算符时,将栈中运算符从栈顶依次弹出进行运算
calculate();
}
}
if(numbers.isEmpty())//数字栈为空时,运算式的第一个数字为负数
{
num.append(tem);
}
else
{
chs.push(newCharacter(tem.charAt(0)));//如果不为空,将其压入栈内
}
next=sb.charAt(0);
if(next=='-')//判断开头字符是否为'-',如果是,则认为该数字是负数,类似1*-2
{
num.append(next);
sb.delete(0,1);//同时去掉一位
}
}
}
//由于前面将数字放入栈内,是通过获取服饰处理的,导致最后一个数字没有放入栈中,因此将最后一个数字放入栈中
BigDecimalbd=newBigDecimal(num.toString());
numbers.push(bd);
//此时栈上面最多只有2个符号,根据优先级符号进行运算
while(!
chs.isEmpty())
{
calculate();
}
returnnumbers.pop();
}
privatevoidcalculate()//计算方法
{
BigDecimalb=numbers.pop();//弹出栈顶的数
BigDecimala=null;
a=numbers.pop();//弹出栈顶第二个数
charope=chs.pop();//弹出栈顶符号
BigDecimalresult=null;//运算结果
switch(ope)
{
case'+':
result=a.add(b);
numbers.push(result);//将结果放入操作数栈内
break;
case'-':
result=a.subtract(b);
numbers.push(result);
break;
case'*':
result=a.multiply(b);
numbers.push(result);
break;
case'/':
result=a.divide(b,3,RoundingMode.HALF_UP);
numbers.push(result);
break;
//case'%':
//result=a.remainder(b);
//numbers.push(result);
//break;
}
}
privatebooleanisNum(Stringnum)//判断是否为数字
{
returnnum.matches("[0-9]");
}
publicvoidactionPerformed(ActionEvente)
{
//if(e.getActionCommand()=="退出")
//System.exit(0);
//if(e.getActionCommand()=="关于计算器")
//dig.setVisible(true);
if(e.getSource()==bt2)//清空C的设置
{
t.setText("");
}
if(e.getSource()==bt1)//back设置
{
StringBuilderstrb=newStringBuilder(t.getText());
if(t.getText().length()!
=0)
{
t.setText(strb.delete(strb.length()-1,strb.length()).toString());
}
}
for(inti=0;i{
if(e.getSource()==b[i])
{Stringstr=t.getText();
str+=(""+i);
t.setText(str);
}
}
JButton[]b2={bt3,bt4,bt5,bt6,bt8,bt10};//加,减,乘,除,小数点,百分号
for(inti=0;i{
if(e.getSource()==b2[i])
{
Stringstr=t.getText();
str=str+b2[i].getActionCommand();
t.setText(str);
}
}
if(e.getSource()==bt12)//负号
{
Stringstr=t.getText();
t.setText(str+"-");
}
if(e.getSource()==bt7)//等于号
{
Stringstr=t.getText();
Stringstr1=calculate(str)+"";
t.setText(str1);
}
if(e.getSource()==bt9)//开方
{
Stringstr=t.getText();
if(str.charAt(0)=='-')
{
dig1.setVisible(true);
}
else
{
doubledb=Math.sqrt(calculate(str).doubleValue());
t.setText(db+"");
}
}
if(e.getSource()==bt11)//求倒数
{
Stringstr=t.getText();
doublea=calculate(str).doubleValue();
doubleb=1/a;
t.setText(b+"");
}
}
}
importjava.awt.*;
importjavax.swing.*;
classGridFrameextendsJFrame{
//定义面板,并设置为网格布局,4行4列,组件水平、垂直间距均为3
JPanelp=newJPanel(newGridLayout(4,4,3,3));
JTextAreat=newJTextArea(); //定义文本框
//定义字符串数组,为按钮的显示文本赋值
//注意字符元素的顺序与循环添加按钮保持一致
Stringstr[]={"7","8","9","/","4","5","6","*","1","2","3","-","0",".","=","+"};
publicGridFrame(Strings){
super(s); //为窗体名称赋值
setLayout(newBorderLayout()); //定义窗体布局为边界布局
JButtonbtn[]; //声明按钮数组
btn=newJButton[str.length]; //创建按钮数组
//循环定义按钮,并添加到面板中
for(inti=0;i btn[i]=newJButton(str[i]);
p.add(btn[i]);
}
//将文本框放置在窗体NORTH位置
getContentPane().add(t,BorderLayout.NORTH);
//将面板放置在窗体CENTER位置
getContentPane().add(p,BorderLayout.CENTER);
setVisible(true);
setSize(250,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); //让窗体居中显示
}
publicstaticvoidmain(String[]args){
GridFramegl=newGridFrame("网格布局计算机!
");
}
}