java实现计算器功能_用java实现计算器功能

/*** 一个计算器,与Windows附件自带计算器的标准版功能、界面相仿。 但还不支持键盘操作。*/public classMyCalculator extendsJFrame implementsActionListener {

/** 计算器上的键的显示名字 */private finalString[] KEYS= { "7","8","9","/","sqrt","4","5","6","*","%","1","2","3","-","1/x","0","+/-",".","+","="};/** 计算器上的功能键的显示名字 */private finalString[] COMMAND= { "Backspace","CE","C"};/** 计算器左边的M的显示名字 */private finalString[] M= { " ","MC","MR","MS","M+"};/** 计算器上键的按钮 */privateJButton keys[] = newJButton[KEYS.length];/** 计算器上的功能键的按钮 */privateJButton commands[] = newJButton[COMMAND.length];/** 计算器左边的M的按钮 */privateJButton m[] = newJButton[M.length];/** 计算结果文本框 */privateJTextField resultText= newJTextField("0");// 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字private booleanfirstDigit= true;// 计算的中间结果。private doubleresultNum= 0.0;// 当前运算的运算符privateString operator= "=";// 操作是否合法private booleanoperateValidFlag= true;/*** 构造函数*/publicMyCalculator() {

super();// 初始化计算器init();// 设置计算器的背景颜色this.setBackground(Color.LIGHT_GRAY);this.setTitle("计算器");// 在屏幕(500, 300)坐标处显示计算器this.setLocation(500,300);// 允许修改计算器的大小this.setResizable(true);// 使计算器中各组件大小合适this.pack();}

/*** 初始化计算器*/private voidinit() {

// 文本框中的内容采用右对齐方式resultText.setHorizontalAlignment(JTextField.RIGHT);// 不允许修改结果文本框resultText.setEditable(false);// 设置文本框背景颜色为白色resultText.setBackground(Color.WHITE);// 初始化计算器上键的按钮,将键放在一个画板内JPanel calckeysPanel = newJPanel();// 用网格布局器,4行,5列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素calckeysPanel.setLayout(newGridLayout(4,5,3,3));for(inti = 0;i < KEYS.length;i++) {

keys[i] = newJButton(KEYS[i]);calckeysPanel.add(keys[i]);keys[i].setForeground(Color.blue);}

// 运算符键用红色标示,其他键用蓝色表示keys[3].setForeground(Color.red);keys[8].setForeground(Color.red);keys[13].setForeground(Color.red);keys[18].setForeground(Color.red);keys[19].setForeground(Color.red);// 初始化功能键,都用红色标示。将功能键放在一个画板内JPanel commandsPanel = newJPanel();// 用网格布局器,1行,3列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素commandsPanel.setLayout(newGridLayout(1,3,3,3));for(inti = 0;i < COMMAND.length;i++) {

commands[i] = newJButton(COMMAND[i]);commandsPanel.add(commands[i]);commands[i].setForeground(Color.red);}

// 初始化M键,用红色标示,将M键放在一个画板内JPanel calmsPanel = newJPanel();// 用网格布局管理器,5行,1列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素calmsPanel.setLayout(newGridLayout(5,1,3,3));for(inti = 0;i < M.length;i++) {

m[i] = newJButton(M[i]);calmsPanel.add(m[i]);m[i].setForeground(Color.red);}

// 下面进行计算器的整体布局,将calckeys和command画板放在计算器的中部,// 将文本框放在北部,将calms画板放在计算器的西部。// 新建一个大的画板,将上面建立的command和calckeys画板放在该画板内JPanel panel1 = newJPanel();// 画板采用边界布局管理器,画板里组件之间的水平和垂直方向上间隔都为3象素panel1.setLayout(newBorderLayout(3,3));panel1.add("North",commandsPanel);panel1.add("Center",calckeysPanel);// 建立一个画板放文本框JPanel top = newJPanel();top.setLayout(newBorderLayout());top.add("Center",resultText);// 整体布局getContentPane().setLayout(newBorderLayout(3,5));getContentPane().add("North",top);getContentPane().add("Center",panel1);getContentPane().add("West",calmsPanel);// 为各按钮添加事件侦听器// 都使用同一个事件侦听器,即本对象。本类的声明中有implements ActionListenerfor(inti = 0;i < KEYS.length;i++) {

keys[i].addActionListener(this);}

for(inti = 0;i < COMMAND.length;i++) {

commands[i].addActionListener(this);}

for(inti = 0;i < M.length;i++) {

m[i].addActionListener(this);}

}

/*** 处理事件*/public voidactionPerformed(ActionEvent e) {

// 获取事件源的标签String label = e.getActionCommand();if(label.equals(COMMAND[0])) {

// 用户按了"Backspace"键handleBackspace();} else if(label.equals(COMMAND[1])) {

// 用户按了"CE"键resultText.setText("0");} else if(label.equals(COMMAND[2])) {

// 用户按了"C"键handleC();} else if("0123456789.".indexOf(label) >= 0) {

// 用户按了数字键或者小数点键handleNumber(label);// handlezero(zero);} else{

// 用户按了运算符键handleOperator(label);}

}

/*** 处理Backspace键被按下的事件*/private voidhandleBackspace() {

String text = resultText.getText();inti = text.length();if(i > 0) {

// 退格,将文本最后一个字符去掉text = text.substring(0,i - 1);if(text.length() == 0) {

// 如果文本没有了内容,则初始化计算器的各种值resultText.setText("0");firstDigit= true;operator= "=";} else{

// 显示新的文本resultText.setText(text);}

}

}

/*** 处理数字键被按下的事件**@paramkey*/private voidhandleNumber(String key) {

if(firstDigit) {

// 输入的第一个数字resultText.setText(key);} else if((key.equals(".")) && (resultText.getText().indexOf(".") < 0)) {

// 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面resultText.setText(resultText.getText() + ".");} else if(!key.equals(".")) {

// 如果输入的不是小数点,则将数字附在结果文本框的后面resultText.setText(resultText.getText() + key);}

// 以后输入的肯定不是第一个数字了firstDigit= false;}

/*** 处理C键被按下的事件*/private voidhandleC() {

// 初始化计算器的各种值resultText.setText("0");firstDigit= true;operator= "=";}

/*** 处理运算符键被按下的事件**@paramkey*/private voidhandleOperator(String key) {

if(operator.equals("/")) {

// 除法运算// 如果当前结果文本框中的值等于0if(getNumberFromText() == 0.0) {

// 操作不合法operateValidFlag= false;resultText.setText("除数不能为零");} else{

resultNum/= getNumberFromText();}

} else if(operator.equals("1/x")) {

// 倒数运算if(resultNum== 0.0) {

// 操作不合法operateValidFlag= false;resultText.setText("零没有倒数");} else{

resultNum= 1/ resultNum;}

} else if(operator.equals("+")) {

// 加法运算resultNum+= getNumberFromText();} else if(operator.equals("-")) {

// 减法运算resultNum-= getNumberFromText();} else if(operator.equals("*")) {

// 乘法运算resultNum*= getNumberFromText();} else if(operator.equals("sqrt")) {

// 平方根运算resultNum= Math.sqrt(resultNum);} else if(operator.equals("%")) {

// 百分号运算,除以100resultNum= resultNum/ 100;} else if(operator.equals("+/-")) {

// 正数负数运算resultNum= resultNum* (-1);} else if(operator.equals("=")) {

// 赋值运算resultNum= getNumberFromText();}

if(operateValidFlag) {

// 双精度浮点数的运算longt1;doublet2;t1 = (long) resultNum;t2 = resultNum- t1;if(t2 == 0) {

resultText.setText(String.valueOf(t1));} else{

resultText.setText(String.valueOf(resultNum));}

}

// 运算符等于用户按的按钮operator= key;firstDigit= true;operateValidFlag= true;}

/*** 从结果文本框中获取数字**@return*/private doublegetNumberFromText() {

doubleresult = 0;try{

result = Double.valueOf(resultText.getText()).doubleValue();} catch(NumberFormatException e) {

}

returnresult;}

public static voidmain(String args[]) {

MyCalculator calculator1 = newMyCalculator();calculator1.setVisible(true);calculator1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}

}

你可能感兴趣的:(java实现计算器功能)