⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator.java

📁 实现了WINDOWS计算器的所有功能,界面和WINDOWS的一莫一样,这是不完善版本,
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
package calculator;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.text.DecimalFormat;
import javax.swing.*;


/* 关于计算器:
 * 此计算器在一些方面做了一点改进,在限制字符录入方面做了改善但还做得不够完善。
 * 为了使计算器在初始状态下显示"0."在这方面加了很多判断,有点得不偿失的感觉。将其去掉可减少很多代码。
 * 由于此计算器录入的是表达式,windows的统计框在这个计算器中失去了其存在的意义。
 * 可考虑将其改为历史记录框,这样在进行大量计算时,可使以前的计算信息更了然。
 * 
 * 第二部分为事件的监听,在事件监听中对字符录入做了一点限制,在判断语句上有点过长;由于时间问题,为加以改善。
 * 第三部分为事件监听的处理。三个内部类,一个为统计框,一个为进制转换类,一个为字符串转表达式解析器参考《数据结构与算法》
 * 此计算器的关键算法在第三部分,读者了解第三部分第二三个类即可;
 * 笔者邮箱aaaa_2668@sina.com;
 * 程序中有不足的地方 欢迎各位来信交流;
*/
public class Calculator extends JFrame implements ActionListener,MouseListener{	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	MyDialog dialog;
	JLabel jl4,jl5; //创建标签对象;
	JMenuBar jmb;
	JMenu menu1,menu2,menu3;
	JMenuItem[] item = new JMenuItem[19];
	JTextField textField1 = new JTextField(20);//文本框对象
	JRadioButton[] jrb = new JRadioButton[11];//创建单选框对象
	JCheckBox jc1,jc2;//创建复选框对象;
	JButton[] jb = new JButton[58];//创建按钮对象
	boolean clickable=true ,dot=false,degree=false,radian=true,grads=false;// clickable其他进制小数点无效,dot这个变量用来在文本框最初录入的时候录入小数degree(单选按钮的角度)radian(单选按钮的弧度)grads(单选按钮的梯度)
	int jinzhi=10,bag=0;//bag用来设定jbl4中的括号个数以便输入正确的括号个数;
	String MS="0.";//用来监听jb[22]用来存储字符串;
	 objConversion convert = new objConversion();  //用来将数字转换成字符串

	/**
	 * 一共用了九个面板
	 * 
	 */
	JPanel top,jp,jp1,jp2,jp3,jp4,jp5,jp6,jp7;
	
public Calculator()                   //构造函数
 { 
	this.setLayout(null); //用空布局,用了很多绝对定位                                                                   
	//new一个菜单条----------------------------------------------------------菜单部分-------------------------------------------------------------------------
	jmb = new JMenuBar();
	menu1 = new JMenu("编辑(E)");
	//设置助记符
	menu1.setMnemonic('E');
	menu1.setFont(new Font("宋体",Font.PLAIN,12));
	//设置menu1的菜单项
	item[0] = new JMenuItem("粘贴(C)");
	item[0].setMnemonic('C');
	//给菜单项添加快捷键
	item[0].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));
	item[1] = new JMenuItem("复制(P)");
	item[1].setMnemonic('P');
	item[1].setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
	//将menu1的菜单项添加到菜单上
	menu1.add(item[0]);
	menu1.add(item[1]);
	
	menu2 = new JMenu("查看(V)");
	menu2.setMnemonic('V');
	menu2.setFont(new Font("宋体",Font.PLAIN,12));
	//设置menu2的菜单项
	item[2] = new JMenuItem("   标准型(I)");
	item[2].setMnemonic('I');
	item[3] = new JMenuItem("● 科学型(S)");
	item[3].setMnemonic('S');
	item[4] = new JMenuItem("   十六进制(H)");
	item[4].setMnemonic('H');
	item[5] = new JMenuItem("● 十进制(D)");
	item[5].setMnemonic('D');
	item[6] = new JMenuItem("   八进制(O)");
	item[6].setMnemonic('O');
	item[7] = new JMenuItem("   二进制(B)");
	item[7].setMnemonic('B');
	item[8] = new JMenuItem("● 角度(E)");
	item[8].setMnemonic('E');
	item[9] = new JMenuItem("   弧度(R)");
	item[9].setMnemonic('R');
	item[10] = new JMenuItem("   梯度(G)");
	item[10].setMnemonic('G');

	item[11] = new JMenuItem("● 四字(Q)");
	item[11].setMnemonic('Q');
	item[11].setVisible(false);
	item[12] = new JMenuItem("   DWORD值(R)");
	item[12].setMnemonic('R');
	item[12].setVisible(false);
	item[13] = new JMenuItem("   单字(W)");
	item[13].setMnemonic('W');
	item[13].setVisible(false);
	item[14] = new JMenuItem("   字节(Y)");
	item[14].setMnemonic('Y');
	item[14].setVisible(false);
	
	item[15] = new JMenuItem("数字分组(I)");
	item[15].setMnemonic('I');
    //将菜单项添加到菜单上
	for(int i=2;i<16;i++)
	{
		menu2.add(item[i]);
        if(i==3||i==7||i==14)
        	menu2.addSeparator();
  
	}
	     menu3 = new JMenu("帮助(H)");
	     menu3.setMnemonic('H');
	     menu3.setFont(new Font("宋体",Font.PLAIN,12));
	//设置menu3的菜单项
	item[16] = new JMenuItem("帮助主题(H)");
	item[16].setMnemonic('H');
	item[17] = new JMenuItem("关于计算器(A)");
	item[17].setMnemonic('A');
	item[18] = new JMenuItem("作者主页(L)");
	item[18].setMnemonic('L');
	//将menu3的菜单项添加到菜单上
	   menu3.add(item[16]);
	   menu3.addSeparator();
	   menu3.add(item[17]);
	   menu3.add(item[18]);
	   
	   for(int i=0;i<19;i++)
	   {
			 item[i].setFont(new Font("宋体",Font.PLAIN,12));
			 item[i].addActionListener(this);                                         //对所有菜单项  添加事件监听器-----------------------------------
	   }
	
	   
	//将菜单添加到菜单条上
    jmb.add(menu1);
    jmb.add(menu2);
    jmb.add(menu3);
    
//---------------------------------------------------------------------------------文本框--------------------------------------------------------------------
    
	textField1.setBounds(40,0,450,25);
	textField1.setText("0.");
//------------------------------------------------------------------------------单选按钮---------------------------------------------------------------------	
	jrb[0] = new JRadioButton("十六进制");
	jrb[1] = new JRadioButton("十进制");
	jrb[1].setSelected(true);
	jrb[2] = new JRadioButton("八进制");
	jrb[3] = new JRadioButton("二进制");
	jrb[4] = new JRadioButton("角度");
	jrb[5] = new JRadioButton("弧度");
	jrb[5].setSelected(true);            //默认被选中
	jrb[6] = new JRadioButton("梯度");
	jrb[7] = new JRadioButton("四字");
	jrb[7].setSelected(true);
	jrb[8] = new JRadioButton("双字");
	jrb[9] = new JRadioButton("单字");
	jrb[10] = new JRadioButton("字节");

	
	
    jp = new JPanel();
    jp.setBorder(BorderFactory.createEtchedBorder(1));
    jp.setBounds(10,25,270,30);
    ButtonGroup bg = new ButtonGroup();
    for(int i=0;i<4;i++)
    {
    	bg.add(jrb[i]);
    	jp.add(jrb[i]);
    }
    
    jp1 = new JPanel();
    jp1.setBorder(BorderFactory.createEtchedBorder(1));
    jp1.setBounds(300,25,218,30);
     ButtonGroup bg1 = new ButtonGroup();  
     for(int i=4;i<7;i++)
     {
     	bg1.add(jrb[i]);
     	jp1.add(jrb[i]);
     }

     jp7 = new JPanel();
     jp7.setBorder(BorderFactory.createEtchedBorder(1));
     jp7.setBounds(300,25,218,30);
      ButtonGroup bg2 = new ButtonGroup();  
      for(int i=7;i<11;i++)
      {
      	bg2.add(jrb[i]);
      	jp7.add(jrb[i]);
      }
      
     
    for(int i=0;i<11;i++){
		jrb[i].setMargin(new Insets(0,0,0,0));
		jrb[i].setFont(new Font("宋体",Font.PLAIN,12));
		jrb[i].addActionListener(this);                                              //对所有单选框  添加事件监听器-----------------------------------
	}
//  -------两组单选框用了三个个面板jp,jp1与jp7------------     
   /***************************************两个复选框,和两个凹进去的标签*****************************************/ 
	jc1 = new JCheckBox("Inv");
	jc1.setBounds(10,55,60,25);
	jc1.setFont(new Font("宋体",Font.PLAIN,12));
	jc1.addActionListener(this);
	jc2 = new JCheckBox("Hyp");
	jc2.setBounds(75,55,50,25);
	jc2.setFont(new Font("宋体",Font.PLAIN,12));
	jc2.addActionListener(this);                                                     //对复选框  添加事件监听器-----------------------------------
	
	jl4 = new JLabel();
	jl4.setBounds(130,55,28,28);
	jl4.setFont(new Font("宋体",Font.PLAIN,12));
	jl4.setBorder(BorderFactory.createBevelBorder(1));
	
	/*	通常我们的Jlabel当中的文字是靠左边显示的,字体的颜色为黑色,大小也一样.如果我们想让它居中显示,则只需加一个参数即可.
	在Swing当中,很多的组件是支持HTML代码的,也就是说我们可以使用HTML语言来实现一些特效:
	jl5 = new JLabel("<html><font size=5 color =blue>欢迎使用!</font></html>",SwingConstants.CENTER);*/	
	jl5 = new JLabel("",SwingConstants.CENTER);
	jl5.setBounds(175,55,28,28);
	jl5.setFont(new Font("宋体",Font.PLAIN,12));
	jl5.setBorder(BorderFactory.createBevelBorder(1));
	/***************************************************按钮部分*******************************************************/
	jb[0] = new JButton("Sta");
	dialog = new MyDialog();
	dialog. setBounds(60,60,250,175);
	jb[0].setForeground(Color.BLUE);
	jb[1] = new JButton("Ave");
	jb[2] = new JButton("Sum");
	jb[3] = new JButton("s");
	jb[4] = new JButton("Dat");
	for(int i=1;i<5;i++)
	{
		jb[i].setEnabled(false);
		jb[i].setForeground(Color.blue);
	}                                       //以上五个按键用了jp3
	

	jb[5]= new JButton("F-E");
	jb[6] = new JButton("(");
	jb[7] = new JButton(")");
	jb[8] = new JButton("dms");
	jb[9] = new JButton("Exp");
	jb[10] = new JButton("ln");
	jb[11] = new JButton("sin");
	jb[12] = new JButton("x^y");
	jb[13] = new JButton("log");
	jb[14] = new JButton("cos");
	jb[15] = new JButton("x^3");
	jb[16] = new JButton("n!");
	jb[17] = new JButton("tan");
	jb[18] = new JButton("x^2");
	jb[19] = new JButton("1/x");              //以上十五个按键用了jp4
	
	
	jb[20] = new JButton("MC");
	jb[20].setForeground(Color.red);
	jb[21] = new JButton("MR");
	jb[21].setForeground(Color.red);
	jb[22] = new JButton("MS");
	jb[22].setForeground(Color.red);
	jb[23] = new JButton("M+");
	jb[23].setForeground(Color.red);
	jb[24] = new JButton("pi");
	jb[24].setForeground(Color.BLUE);          //以上五个按键用了jp5
	
	
	jb[25] = new JButton("Backspace");
	jb[25].setForeground(Color.red);
	jb[26] = new JButton("CE");
	jb[26].setForeground(Color.red);
	jb[27] = new JButton("C");
	jb[27].setForeground(Color.red);           //三个删除按钮用了面板jp2    
	
	
	jb[28] = new JButton("7");
	jb[28].setForeground(Color.BLUE);
	jb[29] = new JButton("8");
	jb[29].setForeground(Color.BLUE);
	jb[30] = new JButton("9");
	jb[30].setForeground(Color.BLUE);
	jb[31] = new JButton("/");
	jb[31].setForeground(Color.red);
	jb[32] = new JButton("Mod");
	jb[32].setForeground(Color.red);
	jb[33] = new JButton("And");
	jb[33].setForeground(Color.red);
	jb[34] = new JButton("4");
	jb[34].setForeground(Color.BLUE);
	jb[35] = new JButton("5");
	jb[35].setForeground(Color.BLUE);
	jb[36] = new JButton("6");
	jb[36].setForeground(Color.BLUE);
    jb[37] = new JButton("*");
    jb[37].setForeground(Color.red);
    jb[38] = new JButton("Or");
    jb[38].setForeground(Color.red);
    jb[39] = new JButton("Xor");
    jb[39].setForeground(Color.red);
    jb[40] = new JButton("1");
    jb[40].setForeground(Color.BLUE);
    jb[41] = new JButton("2");
    jb[41].setForeground(Color.BLUE);
    jb[42] = new JButton("3");
    jb[42].setForeground(Color.BLUE);
    jb[43] = new JButton("-");
    jb[43].setForeground(Color.red);
    jb[44] = new JButton("Lsh");
    jb[44].setForeground(Color.red);
    jb[45] = new JButton("Not");
    jb[45].setForeground(Color.red);
    jb[46] = new JButton("0");
    jb[46].setForeground(Color.BLUE);
    jb[47] = new JButton("+/-");
    jb[47].setForeground(Color.BLUE);
    jb[48] = new JButton(".");
    jb[49] = new JButton("+");
    jb[49].setForeground(Color.red);
    jb[50] = new JButton("=");
    jb[50].setForeground(Color.red);
    jb[51] = new JButton("Int");
    jb[51].setForeground(Color.red);
      
    jb[52] = new JButton("A");
    jb[53] = new JButton("B");
    jb[54] = new JButton("C");
    jb[55] = new JButton("D");
    jb[56] = new JButton("E");
    jb[57] = new JButton("F");                         //以上30个按钮用了jp6.....
    
    /******************************************************对以上58个按钮进行面板分类,颜色,监听等设置*********************************/
   for(int i=52;i<58;i++)
   {
	   jb[i].setEnabled(false);
	   jb[i].setForeground(Color.BLUE);
   }
 
    for(int i=0;i<58;i++)
    {
	jb[i].setMargin(new Insets(0,0,0,0));
    jb[i].setFont(new Font("宋体",Font.PLAIN,12));
    jb[i].setBorder(BorderFactory.createBevelBorder(0));
    jb[i].addActionListener(this);
    jb[i].addMouseListener(this);                                                    //对所有的 58个按钮添加监听器---------------
    }

		
    jp2 = new JPanel();
    jp2.setBounds(320,55,197,25);
    jp2.setLayout(new GridLayout(1,3,5,5));
    jp2.add(jb[25]);
    jp2.add(jb[26]);
    jp2.add(jb[27]);
    jp3 = new JPanel();
    jp3.setLayout(new GridLayout(5,1,5,5));
    jp3.setBounds(10,85,35,150);
    for(int i=0;i<5;i++)
    	jp3.add(jb[i]);
  
    jp4 = new JPanel();
    jp4.setLayout(new GridLayout(5,3,5,5));
    jp4.setBounds(60,85,120,150);
   for(int i=5;i<20;i++)
   {
	   jb[i].setForeground(Color.magenta);
	   jp4.add(jb[i]);
   }
   jp5 = new JPanel();
   jp5.setBounds(190,85,35,150);
   jp5.setLayout(new GridLayout(5,1,5,5));
   for(int i=20;i<25;i++)
	   jp5.add(jb[i]);
   
   jp6 = new JPanel();
   jp6.setBounds(300,85,222,150);
   jp6.setLayout(new GridLayout(5,6,5,5));
   for(int i=28;i<58;i++)
	   jp6.add(jb[i]);
   
   
   /******************************************************把以上所有 对象添加到本窗体中*************************************************/
   //给窗体设置图标
   ImageIcon icon = new ImageIcon("icon.jpg");
   this.setIconImage(icon.getImage());
	this.setJMenuBar(jmb);
	this.add(textField1);
	textField1.setHorizontalAlignment(JTextField.RIGHT);
	this.add(jp);
	this.add(jp1);
	this.add(jc1);
	this.add(jc2);
	this.add(jl4);
	this.add(jl5);
	this.add(jp2);
	this.add(jp3);
	this.add(jp4);
	this.add(jp5);
	this.add(jp6);
    this.add(jp7);
    jp7.setVisible(false);
	
	this.setBounds(300,300,535,300);
	this.setResizable(false);
	this.setVisible(true);
	this.setTitle("计算器");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -