文档章节

一个简单的计算器

 恒者
发布于 2014/04/11 22:34
字数 1240
阅读 176
收藏 3
package com.xxx.calculator;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
/*
 * 作者:恒者
 * 功能:实现一个计算器
 * 描述:使用Swing实现,界面采用边界布局管理器和网格布局管理器;
 *     BorderLayout的NORTH部分放置一个面板,显示运算结果的文本框;CENTER部分放置一个面板,采用GridLayout布局所有按钮
 * */
public class MainFrame extends JFrame implements ActionListener {
 //初始化所有按键值
 private static final String[] KEYS = {
  "CE", "C", "Back", "%",
  "7", "8", "9", "/",
  "4", "5", "6", "*",
  "1", "2", "3", "+",
  "0", ".", "=", "-"
 };
 //按键数组
 private JButton[] buttons = new JButton[KEYS.length];
 //声明 显示结果的文本框
 private JTextField resultText;
 
 //结果数值
 private double result = 0.0;
 //是否为第一个数字
 private boolean firstNum = true;
 //记录输入的运算符,默认为"="
 private String operator = "=";
 //运算符是否有效
 private boolean operatorFlag = false;
 
 /*
  * 构造方法
  * */
 public MainFrame(){
  //设置窗口的标题,位置和大小,默认关闭方式
  setTitle("简易计算器");
  setBounds(500, 200, 290, 220);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  //获取窗口容器对象,并设置其布局管理器
  Container c = getContentPane();
  c.setLayout(new BorderLayout());
  
  //设置禁止调整窗口的大小(true:可调整窗口大小,false:禁止调整窗口大小)
  setResizable(false);
  
  //创建面板,用于放置显示结果的文本框
  JPanel resultPanel = new JPanel();
  
  //创建文本框,用于显示运算结果
  resultText = new JTextField();
  //设置文本框的文本的水平对齐方式
  resultText.setHorizontalAlignment(SwingConstants.RIGHT);
  resultText.setText("0");
  resultText.setColumns(25);
  //设置文本框不可编辑
  resultText.setEditable(false);
  //将文本框添加到面板
  resultPanel.add(resultText);
  
  //将结果面板添加到窗口容器中
  c.add(resultPanel, BorderLayout.NORTH);
  
  //创建面板,用于放置所有按钮
  JPanel calcPanel = new JPanel();
  //创建一个网格布局管理器,网格行数5列数5,组件之间的水平间距5垂直间距5
  final GridLayout gridLayout = new GridLayout(5, 4, 5, 5);
  //设置面板的布局管理器
  calcPanel.setLayout(gridLayout);
  
  //通过循环创建所需的按钮
  for(int i = 0; i < KEYS.length; i++){
   //创建按钮
   buttons[i] = new JButton(KEYS[i]);
   //注册事件
   buttons[i].addActionListener(this);
   //将按钮添加到面板中
   calcPanel.add(buttons[i]);
  }
  
  //为运算符按钮添加颜色
  //"%"
  buttons[3].setForeground(Color.RED);
  //"/"
  buttons[7].setForeground(Color.RED);
  //"*"
  buttons[11].setForeground(Color.RED);
  //"+"
  buttons[15].setForeground(Color.RED);
  //"-"
  buttons[19].setForeground(Color.RED);
  
  //将按钮面板添加到窗口容器中
  c.add(calcPanel, BorderLayout.CENTER);
 }
 
 /*
  * 实现ActionListener事件监听器的接口方法actionPerformed()
  * */
 public void actionPerformed(ActionEvent e){
  //获取命令字符串
  String command = e.getActionCommand();
  //判断是否为数字键,若是,则由numberKey(command)方法处理
  if("0123456789.".indexOf(command) != -1){
   numberKey(command);
  }
  //判断是否为Back退格键,若是则有backPress(command)方法处理
  else if("Back".equals(command)){
   backPress(command);
  }
  //判断是否为CE键
  else if("CE".equals(command)){
   //清0
   resultText.setText("0");
   firstNum = true;//修复bug,之前CE后,输入数字之前添加0呈现:08
  }
  //判断是否为C键,复位键
  else if("C".equals(command)){
   //恢复初始状态
   resultText.setText("0");
   result = 0.0;
   firstNum = true;
   operator = "=";
  }
  //若是运算符,则有operatorPress(command)处理
  else{
   operatorPress(command);
  }
 }
 
 /*
  * 按下数字键
  * */
 public void numberKey(String key){
  //判断是否为第一个数
  if(firstNum){
   //若是第一个数,将输入值设置到文本框
   resultText.setText(key);
   //设置firstNum为不是第一个数表示下一次输入的数不是第一个数
   firstNum = false;
  }
  //判断当前数字是否 是小数点,且以输入的数字没有含有小数点
  else if(".".equals(key) && resultText.getText().indexOf(".") == -1){
   //获取文本框中的原有值
   String temp = resultText.getText();
   //加入小数点
   resultText.setText(temp + ".");
  }
  //不是小数点
  else if(!".".equals(key)){
   //获取文本框中的原有值
   String temp = resultText.getText();
   //加入新值
   resultText.setText(temp + key);
  }
 }
 
 /*
  * 按下退格键
  * */
 public void backPress(String key){
  //获取文本框中的数字
  String temp = resultText.getText();
  //判断是否有数字
  if(temp.length() > 0){
   //删除最后一位
   temp = temp.substring(0, temp.length()-1);
   //判断是否只有一个字符
   if(temp.length() == 0){
    //若是,文本框中数字为0
    temp = "0";
    //firstNum为true即第一个数字为真
    firstNum = true;
   }
  }
  //设置文本框中的新内容
  resultText.setText(temp);
 }
 
 /*
  * 按下运算符键
  * 注意:本次输入的运算符,保存着下次使用,本次使用上一次保存的输入运算符,第一次默认为=
  * 运算符为=时,相当于重置运算符,以进行下一次计算
  * */
 public void operatorPress(String key){
  //判断记录的运算符operator是否为加运算符"+"
  if("+".equals(operator)){
   result += getNumber();
  }
  
  //"-"
  if("-".equals(operator)){
   result -= getNumber();
  }
  
  //"*"
  if("*".equals(operator)){
   result *= getNumber();
  }
  
  //"/"
  if("/".equals(operator)){
   result /= getNumber();
  }
  
  //"%"
  if("%".equals(operator)){
   result /= 100;
  }
  
  //operator默认为"="
  if("=".equals(operator)){
   result = getNumber();
  }
  
  //判断输入的运算符是否有效,默认第一次输入的运算符无效
  if(operatorFlag){
   //获取结果的long值
   long l = (long)result;
   double temp = result - l;
   //判断结果是否为整数
   if(temp == 0){
    resultText.setText(String.valueOf(l));
   }
   else{
    resultText.setText(String.valueOf(result));
   }
  }
  
  //本次输入的运算符有效(下一次判断)
  operatorFlag = true;
  //记录输入的运算符
  operator = key;
  //为第一个数
  firstNum = true;
 }
 
 /*
  * 获取文本框中的值
  * */
 public double getNumber(){
  double result = 0;
  try{
   //将文本框中的值转换为double型
   result = Double.valueOf(resultText.getText()).doubleValue();
  }
  catch(NumberFormatException e){
   e.printStackTrace();
  }
  return result;
 }
 
 /*
  * 测试结果
  * */
 public static void main(String[] args){
  //创建主窗口
  MainFrame frame = new MainFrame();
  //设置窗口可见
  frame.setVisible(true);
 }
}

© 著作权归作者所有

粉丝 10
博文 25
码字总数 38957
作品 0
武汉
私信 提问
『开源』也顺手写一个 科学计算器:重磅开源

前言: 看到 博客园 写了一个 计算器的制作过程《c#制作计算器全过程》,心血来潮 顺手也写了一个; 代码简单,先上运行截图: 编码过程: 新建项目 基于 .Net 2.0: 在窗体上拖拽 文本框 作...

InkFx
2013/11/12
0
0
[b]PHP开发Web服务[/b]

[align=center][b]PHP开发Web服务[/b][/align] WSO2 WSF/PHP(WSO2 Web Services Framework/PHP,WSO2 Web服务框架) 是一个PHP扩展,允许用来创建和使用Web服务。它支持SOAP1.1、SOAP1.2、M...

chszs
2008/09/15
0
0
[软件结构]正向(或者前向)插件系统设计

郑重说明,正向(或者前向)插件系统和反向(或者后向)插件系统均为我个人杜撰出来的词汇,他们是一对概念上相对的设计模式。 —————————————————————————————...

梁欢
2014/06/15
133
0
Google 更新算术 OneBox,加入 34 键虚拟计算器

即便是很一般的三级谷粉也应该知道,Google可以帮你做算术,在搜索框里输入加减乘除甚至是一些简单的方程式都可以得到答案。现在Google继续将这个算术OneBox功能做强做大,现在不仅会显示出答...

oschina
2012/07/26
2K
10
SimpleCalculadora

SimpleCalculadora 提供一个简单且强力的方法来创建计算器,它支持 CSS 定制化,容易进行翻译,并且有两个计算器可供选择。

孔小菜
2015/08/06
202
0

没有更多内容

加载失败,请刷新页面

加载更多

Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
6
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部