📄 calculator.java
字号:
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 + -