杨彩的Java博客
醉里挑灯看剑,梦里吹雨听风.仗剑独走天涯,试问谁与争锋!
posts - 8,comments - 49,trackbacks - 0

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;

public class calculator extends JFrame implements ActionListener
{//这里我把JFrame写成Frame,这个错误找了好久
 JFrame frame;
 
 private JButton jia=new JButton("+");
 private JButton jian=new JButton("-");
 private JButton cheng=new JButton("*");
 private JButton chu=new JButton("/");
 private JButton qiuyi=new JButton("%");
 private JButton deng=new JButton("=");
 private JButton fu=new JButton("+/-");
 private JButton dian=new JButton(".");
 private JButton kai=new JButton("sqrt");
 private JButton diao=new JButton("1/x");
 private JButton aa=new JButton("A");
 private JButton bb=new JButton("B");
 private JButton cc=new JButton("C");
 private JButton dd=new JButton("D");
 private JButton ee=new JButton("E");
 private JButton ff=new JButton("F");
 
 private TextField k1=new TextField(); 
 private objConversion convert = new objConversion();
 
 JMenuItem copy,paste,s,t,help,about,me;
 JRadioButton sixteen,ten,eight,two;
 JButton backspace,ce,c,num0,num1,num2,num3,num4,num5,num6,num7,num8,num9;
 Container cp;
 
 JTextField text;
 String copycontent="";
 boolean clickable=true,clear=true;
 int all=0;
 double qian;
 String fuhao;
 int jin=10,first=1;
 
 
 public calculator()
 {
  setTitle("计算器-杨彩制作");
  setSize(400,300);
  setLocation(250,200);
  text=new JTextField(25);
 // text.setEnabled(false);
  text.setText("0.");
  text.setHorizontalAlignment(JTextField.RIGHT);//从右到左

 
  JPanel cp1=new JPanel();
  JPanel cp2=new JPanel();
  JPanel cp3=new JPanel();
  

  cp=getContentPane();
  cp.add(cp1,"North");
  cp.add(cp2,"Center");
  cp.add(cp3,"South");
  
  cp1.setLayout(new GridLayout(1,6));
  cp2.setLayout(new GridLayout(2,4));
  cp3.setLayout(new GridLayout(6,6));
  
  sixteen=new JRadioButton("十六进制");
  sixteen.setVisible(false);
  ten=new JRadioButton("十进制",true);
  ten.setVisible(false);
  eight=new JRadioButton("八进制");
  eight.setVisible(false); 
  two=new JRadioButton("二进制");
  two.setVisible(false);
  sixteen.addActionListener(this);
  ten.addActionListener(this);
  eight.addActionListener(this);
  two.addActionListener(this); 
  ButtonGroup btg=new ButtonGroup();
  
  btg.add(sixteen); 
  btg.add(ten); 
  btg.add(eight); 
  btg.add(two);
 
  JTextField t3=new JTextField(25);
  cp1.add(text);
 // text.setEnabled(false);
  text.setEditable(false);
  text.setBackground(new Color(255, 255, 255));
  
  cp2.add(sixteen);
  cp2.add(ten);
  cp2.add(eight);
  cp2.add(two);
  
  backspace=new JButton("Backspace");
  backspace.setForeground(new Color(255,0,0));
  backspace.addActionListener(this);
  ce=new JButton("CE");
  ce.setForeground(new Color(255,0,0));
  ce.addActionListener(this);
  c=new JButton("C");
  c.setForeground(new Color(255,0,0));
  c.addActionListener(this);
  k1.setVisible(false);
  cp2.add(k1);
  cp2.add(backspace);
  cp2.add(ce);
  cp2.add(c);
  

  num0=new JButton("0");
  num1=new JButton("1");
  num2=new JButton("2");
  num3=new JButton("3");
  num4=new JButton("4");
  num5=new JButton("5");
  num6=new JButton("6");
  num7=new JButton("7");
  num8=new JButton("8");
  num9=new JButton("9");

 

  cp3.add(num7);
  num7.addActionListener(this);
  cp3.add(num8);
  num8.addActionListener(this);
  cp3.add(num9);
  num9.addActionListener(this);
  cp3.add(chu);
  chu.setForeground(new Color(255,0,0));
  chu.addActionListener(this);
  cp3.add(kai);
  kai.addActionListener(this);
  cp3.add(num4);
  num4.addActionListener(this);
  cp3.add(num5);
  num5.addActionListener(this);
  cp3.add(num6);
  num6.addActionListener(this);
  cp3.add(cheng);
  cheng.setForeground(new Color(255,0,0));
  cheng.addActionListener(this);
  cp3.add(qiuyi);
  qiuyi.addActionListener(this);
  cp3.add(num1);
  num1.addActionListener(this);
  cp3.add(num2);
  num2.addActionListener(this);
  cp3.add(num3);
  num3.addActionListener(this);
  cp3.add(jian);
  jian.setForeground(new Color(255,0,0));
  jian.addActionListener(this);
  cp3.add(diao);
  diao.addActionListener(this);
  cp3.add(num0);
  num0.addActionListener(this);
  cp3.add(fu);
  fu.addActionListener(this);
  cp3.add(dian);
  dian.addActionListener(this);
  cp3.add(jia);
  jia.setForeground(new Color(255,0,0));
  jia.addActionListener(this);
  cp3.add(deng);
  deng.setForeground(new Color(255,0,0));
  deng.addActionListener(this);
  cp3.add(aa);
  aa.addActionListener(this);
  cp3.add(bb);
  bb.addActionListener(this);
  cp3.add(cc);
  cc.addActionListener(this);
  cp3.add(dd);
  dd.addActionListener(this);
  cp3.add(ee);
  ee.addActionListener(this);
  cp3.add(ff);
  ff.addActionListener(this);
  aa.setVisible(false);
  bb.setVisible(false);
  cc.setVisible(false);
  dd.setVisible(false);
  ee.setVisible(false);
  ff.setVisible(false);

     
  JMenuBar mainMenu = new JMenuBar();
  setJMenuBar(mainMenu);
  JMenu editMenu = new JMenu("编辑");
  JMenu viewMenu = new JMenu("查看");
  JMenu helpMenu = new JMenu("帮助");
  mainMenu.add(editMenu);
  mainMenu.add(viewMenu);
  mainMenu.add(helpMenu);
  
  copy = new JMenuItem(" 复制");
  paste = new JMenuItem(" 粘贴");
  KeyStroke copyks=KeyStroke.getKeyStroke(KeyEvent.VK_C,Event.CTRL_MASK);
    copy.setAccelerator(copyks);//设置退出菜单选项加上快捷键
    KeyStroke pasteks=KeyStroke.getKeyStroke(KeyEvent.VK_V,Event.CTRL_MASK);
    paste.setAccelerator(pasteks);//设置退出菜单选项加上快捷键
  editMenu.add(copy);
  editMenu.add(paste);
  copy.addActionListener(this);
  paste.addActionListener(this);
  
  t = new JMenuItem("●标准型");
  s = new JMenuItem("   科学型");
  viewMenu.add(t);
  viewMenu.add(s);
  t.addActionListener(this);
  s.addActionListener(this);
    
  help = new JMenuItem(" 帮助主题");
  about = new JMenuItem(" 关于计算器");
  me = new JMenuItem(" 作者主页");
  helpMenu.add(help);
  helpMenu.add(about); 
  helpMenu.add(me);
  help.addActionListener(this);
  about.addActionListener(this);
  me.addActionListener(this);
  
  

  
  
  
  
  
 addWindowListener(new WindowDestroyer());//结束窗口
 }
 
 


 
 public void actionPerformed(ActionEvent e)
 
 {//响应动作代码
  
  if(first==1)
  text.setText("");
  first=0;//第一次把文本框0.清空
 
   Object temp = e.getSource();

   if(temp==copy)
   {
   copycontent = text.getText();
  }
  if(temp==paste)
   {
   text.setText(text.getText()+copycontent);
  
  }
  if(temp==t)
  {//标准
   
   sixteen.setVisible(false);
   ten.setVisible(false);
   eight.setVisible(false);
   two.setVisible(false);
   t.setText("●标准型");
   s.setText("    科学型");
   aa.setVisible(false);
   bb.setVisible(false);
   cc.setVisible(false);
   dd.setVisible(false);
   ee.setVisible(false);
   ff.setVisible(false);
  }
  if(temp==s)
  {//科学
   
   sixteen.setVisible(true);
   ten.setVisible(true);
   eight.setVisible(true);
   two.setVisible(true);
   t.setText("   标准型");
   s.setText("●科学型");
   aa.setVisible(true);
   bb.setVisible(true);
   cc.setVisible(true);
   dd.setVisible(true);
   ee.setVisible(true);
   ff.setVisible(true);
   aa.setEnabled(false);
   bb.setEnabled(false);
   cc.setEnabled(false);
   dd.setEnabled(false);
   ee.setEnabled(false);
   ff.setEnabled(false);
   
   
  }
  if(temp==help)
  { //打开系统帮助文件 要查资料
   try
   {
     String filePath = "C:/WINDOWS/Help/calc.chm";
      Runtime.getRuntime().exec("cmd.exe /c "+filePath);

   
   }
   catch(Exception eeee)
   {
    System.out.println("打开系统的计算器出错");    
   }
  }
  if(temp==about)
  {
   JOptionPane.showMessageDialog(frame,"      Java计算器\n      杨彩 制作\n\n http://blog.sina.com.cn/m/yangcai","关于计算器",JOptionPane.INFORMATION_MESSAGE); ;
  }
  if(temp==me)
  {
   try
   {
    Process p = Runtime.getRuntime().exec("explorer http://blog.sina.com.cn/m/yangcai");
   }
   catch(Exception eeee)
   {
    System.out.println("打开指定网页出错");    
   } 
  }
  
  
  try
  {
  if(temp==sixteen)
  {
   String hex=text.getText();
   int inthex=Integer.parseInt(hex,jin);//先把数变为10进制  
   text.setText(convert.decHex(inthex)) ;
   jin=16;
   aa.setEnabled(true);
   bb.setEnabled(true);
   cc.setEnabled(true);
   dd.setEnabled(true);
   ee.setEnabled(true);
   ff.setEnabled(true);
   num2.setEnabled(true);
   num3.setEnabled(true);
   num4.setEnabled(true);
   num5.setEnabled(true);
   num6.setEnabled(true);
   num7.setEnabled(true);
   num8.setEnabled(true);
   num9.setEnabled(true);
 
  }
  if(temp==eight)
  {
   String oct =text.getText();
   int intoct=Integer.parseInt(oct,jin);  
   text.setText(convert.decOct(intoct)) ;
   jin=8;
   
   aa.setEnabled(false);
   bb.setEnabled(false);
   cc.setEnabled(false);
   dd.setEnabled(false);
   ee.setEnabled(false);
   ff.setEnabled(false);
   num2.setEnabled(true);
   num3.setEnabled(true);
   num4.setEnabled(true);
   num5.setEnabled(true);
   num6.setEnabled(true);
   num7.setEnabled(true);
   num8.setEnabled(false);
   num9.setEnabled(false);
  }
  if(temp==two)
  {
   String bin=text.getText();
   int intbin=Integer.parseInt(bin,jin);
   text.setText(convert.decBin(intbin));
   jin=2;
   
   aa.setEnabled(false);
   bb.setEnabled(false);
   cc.setEnabled(false);
   dd.setEnabled(false);
   ee.setEnabled(false);
   ff.setEnabled(false);
   num2.setEnabled(false);
   num3.setEnabled(false);
   num4.setEnabled(false);
   num5.setEnabled(false);
   num6.setEnabled(false);
   num7.setEnabled(false);
   num8.setEnabled(false);
   num9.setEnabled(false);
  }
  if(temp==ten)
  {
   String dec=text.getText();
   int intdec=Integer.parseInt(dec,jin);
  // text.setText(convert.decDec(intdec));  //本句会把123变成321
   text.setText(intdec+"");
   jin=10;
   aa.setEnabled(false);
   bb.setEnabled(false);
   cc.setEnabled(false);
   dd.setEnabled(false);
   ee.setEnabled(false);
   ff.setEnabled(false);
   num2.setEnabled(true);
   num3.setEnabled(true);
   num4.setEnabled(true);
   num5.setEnabled(true);
   num6.setEnabled(true);
   num7.setEnabled(true);
   num8.setEnabled(true);
   num9.setEnabled(true);
  }
  }
  catch(Exception ee)
  {
   System.out.println("转换出错,可能你没有输入任何字符");
   text.setText("转换出错");
   clear=false;
  }
  
  if(temp==backspace)
  {//退格
  String s = text.getText();
  text.setText("");
  for (int i = 0; i < s.length() - 1; i++)
  {
  char a = s.charAt(i);
  text.setText(text.getText() + a);
  }
  }
  
  if (temp==ce)
  {
   text.setText("0.");
   clear=true;
   first=1;
  }
  if (temp==c)
  {
   text.setText("0.");   ;
   clear=true;
   first=1;
  }
  
  if(temp==num0)
   {  
    if(clear==false)//判断是否点击了符号位
    text.setText("");
    text.setText(text.getText()+"0");
   }
  
  if(temp==num1)
   {    
    if(clear==false)
    text.setText("");
    text.setText(text.getText()+"1");
    clear=true;//第二次不在清空(前二句)
   }
  
  if(temp==num2)
   {    
    if(clear==false)
    text.setText("");
    text.setText(text.getText()+"2");
    clear=true;
   }
  
  if(temp==num3)
   {    
    if(clear==false)
    text.setText("");
    text.setText(text.getText()+"3");
    clear=true;
   }
  
  if(temp==num4)
   {    
    if(clear==false)
    text.setText("");
    text.setText(text.getText()+"4");
    clear=true;
   }
  
  if(temp==num5)
   {
    if(clear==false)
    text.setText("");
    text.setText(text.getText()+"5");
    clear=true;
   }
  
  if(temp==num6)
   {
    if(clear==false)
    text.setText("");
    text.setText(text.getText()+"6");
    clear=true;
   }
  if(temp==num7)
   {
    if(clear==false)
    text.setText("");
    text.setText(text.getText()+"7");
    clear=true;
   }
  
  if(temp==num8)
   {
    if(clear==false)
    text.setText("");
    text.setText(text.getText()+"8");
    clear=true;
   }
  
  if(temp==num9)
   {
    if(clear==false)
    text.setText("");
    text.setText(text.getText()+"9");
    clear=true;
   }
   if(temp==aa)
   {
    text.setText(text.getText()+"A");
   }
  if(temp==bb)
   {
    text.setText(text.getText()+"B");
   }
  
  if(temp==cc)
   {
    text.setText(text.getText()+"C");
   }
  
  if(temp==dd)
   {
    text.setText(text.getText()+"D");
   }
  
  if(temp==ee)
   {
    text.setText(text.getText()+"E");
   } 
  if(temp==ff)
   {
    text.setText(text.getText()+"F");
   }
   if(temp==dian)
   {
    clickable=true;
    for (int i = 0; i < text.getText().length(); i++)
   if ('.' == text.getText().charAt(i))
   {
   clickable=false;
   break;
   } //第一层判断是否里面含有小数点;
    
    if(clickable==true)//第二坛判断
    text.setText(text.getText()+".");
    
   }
   
  try
  { 
   if(temp==jia)
   {//加法
    qian=Double.parseDouble(text.getText());
    fuhao="+";
    clear=false;
   }
   if(temp==jian)
   {
    qian=Double.parseDouble(text.getText());
    fuhao="-";
    clear=false;
    ;
    
   }
   if(temp==cheng)
   {
    qian=Double.parseDouble(text.getText());
    fuhao="*";
    clear=false;
        
   }
   if(temp==chu)
   {
    qian=Double.parseDouble(text.getText());
    fuhao="/";
    clear=false;
        
   }
   if(temp==deng)
   {
    double ss=Double.parseDouble(text.getText());
    text.setText("");
    if(fuhao=="+")
    text.setText(qian+ss+"");
    if(fuhao=="-")
    text.setText(qian-ss+"");
    if(fuhao=="*")
    text.setText(qian*ss+"");
    if(fuhao=="/")
    text.setText(qian/ss+"");
    clear=false;//要清空前一次的数据
    ;
    
   }
   
   if(temp==kai)
   {    
  String s = text.getText();
  if (s.charAt(0) == '-')
  {
   text.setText("负数不能开根号");
  }
  else
  text.setText(Double.toString(java.lang.Math.sqrt(Double.parseDouble(text.getText()))));
  clear=false;
  }
  
  if(temp==diao)
  {
   
   if (text.getText().charAt(0) == '0'&&text.getText().length() == 1)
    {
    text.setText("除数不能为零");
    }
  else
  {
  boolean isDec = true;
   int i, j, k;
   String s = Double.toString(1 / Double.parseDouble(text.getText()));
   for (i = 0; i < s.length(); i++)
   if (s.charAt(i) == '.')
   break;
   for (j = i + 1; j < s.length(); j++)
   if (s.charAt(j) != '0')
   {
   isDec = false;
   break;
   }
   if (isDec == true)
   {
   String stemp = "";
   for (k = 0; k < i; k++)
    stemp += s.charAt(k);
    text.setText(stemp);
   }
   else
   text.setText(s);
   }
 
    clear=false;
  }
  if(temp==qiuyi)
  {
   text.setText("0");
   clear=false;
  }
  if (temp == fu)
  { //导师,此方法参考书中例子
   boolean isNumber = true;
   String s = text.getText();
   for (int i = 0; i < s.length(); i++)
   if (! (s.charAt(i) >= '0' && s.charAt(i) <= '9' || s.charAt(i) == '.' ||
   s.charAt(i) == '-'))
        {
     isNumber = false;
     break;
     }
   if (isNumber == true)
    {
   //如果当前字符串首字母有'-'号,代表现在是个负数,再按下时,则将首符号去掉
     if (s.charAt(0) == '-')
     {
     text.setText("");
     for (int i = 1; i < s.length(); i++)
         {
       char a = s.charAt(i);
       text.setText(text.getText() + a);
           }
     }
      //如果当前字符串第一个字符不是符号,则添加一个符号在首字母处
   else
   text.setText('-' + s);
   }
  }
  
 }
 catch(Exception eee)
 {
  System.out.println("运算时,首先输入数字或字符");
  text.setText("运算出错");
  clear=false;
 }
  
  
  
 }

 

 class WindowDestroyer extends WindowAdapter
 {//退出窗口动作
  public void windowClosing(WindowEvent e)
  {
  System.exit(0);
  }
 }
 
class objConversion
{//导师,本进制类参考了CSMD类转换例子
 
 public void objConversion ()
 {
 }
 
 public String decDec (int decNum)
 {//10
  
  String strDecNum = Integer.toString(decNum);
  
  for (int i = strDecNum.length(); i < 3; i++)
  {
   strDecNum = "0" + strDecNum;
  }
  
 // return strDecNum;
  return invert (strDecNum, 5);
  
 }
 
 public String decHex (int decNum)
 {//10 to 16
  
  String strHexNum = "";
  int currentNum = 0;
  
  while (decNum != 0)
  {
   
   if (decNum > 15)
   {
    
    currentNum = decNum % 16;
    decNum /= 16;
    
   }
   else
   {
    
    currentNum = decNum;
    decNum = 0;
    
   }
   
   switch (currentNum)
   {
    
    case 15: strHexNum += "F";
       break;
    case 14: strHexNum += "E";
       break;
    case 13: strHexNum += "D";
       break;
    case 12: strHexNum += "C";
       break;
    case 11: strHexNum += "B";
       break;
    case 10: strHexNum += "A";
       break;
    default: strHexNum += Integer.toString(currentNum);
       break;
       
   }
   
  }
   
  return invert (strHexNum, 2);
   
 }
  
 public String decOct (int decNum)
 {//10 to 8
  
  String strOctNum = "";
  
  while (decNum != 0)
  {
   
   if (decNum > 7)
   {
    
    strOctNum += Integer.toString(decNum % 8);
    decNum /= 8;
    
   }
   else
   {
    
    strOctNum += Integer.toString(decNum);
    decNum = 0;
    
   }
   
  }
  
  return invert (strOctNum, 3);
  
 }
 
 public String decBin (int decNum)
 {//10 to 2
  
  String strBinNum = "";
  
  while (decNum != 0)
  {
   
   if (decNum > 1)
   {
    
    strBinNum += Integer.toString(decNum % 2);
    decNum /= 2;
    
   }
   else
   {
    
    strBinNum += Integer.toString(decNum);
    decNum = 0;
    
   }
   
  }
  
  return invert (strBinNum, 8);
  
 }
 
 private String invert (String strNum, int minLength) //转换长度
 {  
  
  String answer = "";
  int length = strNum.length();
  
  if (length < minLength)
  {
   
   for (int padding = (minLength - length); padding > 0; padding--)
   {
    answer += "0";
   }
   
  }
  
  for (int i = length; i > 0; i--)
  {
   answer += strNum.charAt (i - 1);
  }
  
  return answer;
  
 }
 
}
 
 
 public static void main(String arg[])//产生窗口
 {
  calculator win = new calculator(); 
  win.setVisible(true);
 }


}

posted on 2006-11-14 13:35 杨彩 阅读(18004) 评论(9)  编辑  收藏 所属分类: 我的Java程序

FeedBack:
# re: 比较完整的Java计算器
2008-05-22 23:36 | 老鼠
很不错,完整的计算器  回复  更多评论
  
# re: 比较完整的Java计算器
2008-06-21 13:47 | 唐敏
因为是个初学者,所以对于这个程序,还有很多看不太懂的地方,但是我们老师要求能够正确的分析这个程序的代码,有好多函数我都不认识,你能分析一下吗  回复  更多评论
  
# re: 比较完整的Java计算器
2008-11-22 21:15 | sjr
有好多的BUG啊 例如连加  回复  更多评论
  
# re: 比较完整的Java计算器[未登录]
2008-11-26 19:59 | java爱好者
BUG太多了 改天我给你上传份我写的
基本的运算是可以正确的 但是去余拿块有问题
还有你里面一些逻辑上的东西 也是出错的
好多东西没考虑到 估计得重写
但你地方法写的很好
我可以用下 呵呵  回复  更多评论
  
# re: 比较完整的Java计算器
2008-12-08 21:13 | stan
@java爱好者
BUG太多了 小数点处理不好,连续按运算符就算错了。
比如不打0直接打 .不能显示 0.
输入第二个运算数时,不能输入小数。
多符号运算时 ,按两下运算符就出错了。
我写的两百多行,都比你的完善多了
有兴趣找我82703869  回复  更多评论
  
# re: 比较完整的Java计算器
2009-06-23 15:01 | 过路人
就是布局差了点  回复  更多评论
  
# re: 比较完整的Java计算器
2010-06-07 23:21 | gl
有问题???、有Java方面的专家可以聊的话加Q 328518397  回复  更多评论
  
# re: 比较完整的Java计算器[未登录]
2010-12-29 09:39 | kay
能别改天么@java爱好者
  回复  更多评论
  
# re: 比较完整的Java计算器
2013-01-04 10:56 | waimaolh

只有注册用户登录后才能发表评论。


网站导航: