计算器.docx

上传人:b****5 文档编号:5658225 上传时间:2022-12-30 格式:DOCX 页数:13 大小:35.18KB
下载 相关 举报
计算器.docx_第1页
第1页 / 共13页
计算器.docx_第2页
第2页 / 共13页
计算器.docx_第3页
第3页 / 共13页
计算器.docx_第4页
第4页 / 共13页
计算器.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

计算器.docx

《计算器.docx》由会员分享,可在线阅读,更多相关《计算器.docx(13页珍藏版)》请在冰豆网上搜索。

计算器.docx

计算器

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("网格布局计算机!

");

        }

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1