编写一个简单的计算器使用图形用户界面

  1 package com.lovo.calculator;
  2
  3 import java.awt.BorderLayout;
  4 import java.awt.GridLayout;
  5 import java.awt.event.ActionEvent;
  6 import java.awt.event.ActionListener;
  7 import java.awt.event.KeyAdapter;
  8 import java.awt.event.KeyEvent;
  9
 10 import javax.swing.JButton;
 11 import javax.swing.JFrame;
 12 import javax.swing.JPanel;
 13 import javax.swing.JTextField;
 14
 15 /**
 16  * 计算器类
 17  *
 18  * @author Administrator
 19  *
 20  */
 21 public class Calculator extends JFrame implements ActionListener {
 22
 23     private static final long serialVersionUID = 3868243398506940702L;
 24
 25     // 文本框
 26     private JTextField result;
 27     // 按钮数组
 28     private JButton[] buttons;
 29     // 按钮文本
 30     private final String[] characters = { "7", "8", "9", "/", "4", "5", "6",
 31             "*", "1", "2", "3", "-", "0", ".", "=", "+" };
 32     // 是否为第一个输入的数字
 33     private boolean isFirstDigit = true;
 34     // 运算结果
 35     private double resultNum = 0.0;
 36     // 运算符
 37     private String operator = "=";
 38
 39     public Calculator(String title) {
 40         // 设置标题栏
 41         super(title);
 42         // 初始化各组件
 43         init();
 44         // 注册各组件监听器
 45         registerListener();
 46
 47         // 显示窗体
 48         setVisible(true);
 49     }
 50
 51     /**
 52      * 初始化各组件
 53      */
 54     private void init() {
 55         // 常用属性初始化
 56         setSize(220, 200);
 57         setResizable(false);
 58         setLocationRelativeTo(null);
 59         setDefaultCloseOperation(EXIT_ON_CLOSE);
 60
 61         /* 文本框对象初始化 */
 62         result = new JTextField("0");
 63         // 文本右对齐
 64         result.setHorizontalAlignment(JTextField.RIGHT);
 65         // 设置是否可编辑
 66         result.setEditable(false);
 67         /* 按钮初始化 */
 68         buttons = new JButton[characters.length];
 69         for (int i = 0; i < buttons.length; i++) {
 70             buttons[i] = new JButton(characters[i]);
 71             buttons[i].setFocusable(false); // 不允许按钮定位焦点
 72         }
 73         /* 将文本框与按钮添加到窗体中 */
 74         add(result, BorderLayout.NORTH);
 75         JPanel pnl = new JPanel(new GridLayout(4, 4, 5, 5));
 76         for (JButton jButton : buttons) {
 77             pnl.add(jButton);
 78         }
 79         add(pnl);
 80
 81         this.getContentPane().setFocusable(true);
 82     }
 83
 84     /**
 85      * 注册监听器
 86      */
 87     private void registerListener() {
 88         for (JButton jButton : buttons) {
 89             jButton.addActionListener(this);
 90         }
 91
 92         // 注册键盘事件
 93         this.getContentPane().addKeyListener(new KeyAdapter() {
 94             @Override
 95             public void keyPressed(KeyEvent e) {
 96                 String text = String.valueOf(e.getKeyChar());
 97                 if (Character.isDigit(text.charAt(0)) || ".".equals(text)) { // 数字或小数点
 98                     handleNumber(text);
 99                 } else if ("+-*/=".indexOf(text) != -1) { // 运算符
100                     handleOperator(text);
101                 } else if (e.getKeyCode() == 8) { // 退格键
102                     String tmp = result.getText().trim();
103                     if (tmp.length() == 1) {
104                         result.setText("0");
105                         isFirstDigit = true;
106                     } else {
107                         result.setText(tmp.substring(0, tmp.length() - 1));
108                     }
109                 }
110             }
111         });
112     }
113
114     @Override
115     public void actionPerformed(ActionEvent e) {
116         JButton btn = (JButton) e.getSource();
117         String text = btn.getText().trim();
118
119         if (Character.isDigit(text.charAt(0)) || ".".equals(text)) { // 处理数字和小数点
120             handleNumber(text);
121         } else { // 处理运算符
122             handleOperator(text);
123         }
124     }
125
126     /**
127      * 处理数字和小数点
128      *
129      * @param text
130      */
131     private void handleNumber(String text) {
132         if (isFirstDigit) { // 第一次输入
133             if (".".equals(text)) {
134                 this.result.setText("0.");
135             } else {
136                 this.result.setText(text);
137             }
138         } else if ("0".equals(text) && "0".equals(this.result.getText())) {
139             isFirstDigit = true;
140             return;
141         } else if (".".equals(text) && this.result.getText().indexOf(".") == -1) {
142             this.result.setText(this.result.getText() + ".");
143         } else if (!".".equals(text)) {
144             this.result.setText(this.result.getText() + text);
145         }
146
147         isFirstDigit = false;
148     }
149
150     /**
151      * 处理运算符
152      *
153      * @param text
154      */
155     private void handleOperator(String text) {
156         switch (operator) { // 处理各项运算  适用于JDK1.7版本的
157         case "+":
158             resultNum += Double.parseDouble(this.result.getText());
159             break;
160         case "-":
161             resultNum -= Double.parseDouble(this.result.getText());
162             break;
163         case "*":
164             resultNum *= Double.parseDouble(this.result.getText());
165             break;
166         case "/":
167             resultNum /= Double.parseDouble(this.result.getText());
168             break;
169         case "=":
170             resultNum = Double.parseDouble(this.result.getText());
171             break;
172         }
173         // 将文本框的值修改为运算结果
174         this.result.setText(String.valueOf(resultNum));
175         // 将点击的运算符放入operator保存
176         operator = text;
177         // 下一个数字第一次点击
178         isFirstDigit = true;
179     }
180 }

测试类

1 package com.lovo.calculator;
2
3 public class Test {
4
5     public static void main(String[] args) {
6         new Calculator("My Calculator");
7     }
8 }

 

时间: 2024-10-08 15:34:00

编写一个简单的计算器使用图形用户界面的相关文章

界面-基于WinPcap,编写一个简单的数据包捕获程序

问题描述 基于WinPcap,编写一个简单的数据包捕获程序 * 功能要求: 1) 要求提供图形界面(类似Wireshark),可以捕获网络数据包:提供包过滤功能,可以输入过滤表达式:可以指定时段抓包:显示指定数据包的内容: 2) 提供网络数据包统计功能:提供输入IP地址,向指定IP地址发送数据包 3) 提供数据转储功能,将捕获到的数据包存储到磁盘文件,并可以读取转储的文件 4) 界面美观.大方 解决方案 一个简单的摄像头视频浏览和捕获的程序(转载)WinPcap捕获数据包 解决方案二: ** 看

用js编写的简单的计算器代码程序_javascript技巧

最近编写的一个简单的计算器代码程序,先给大家展示一下 分享代码如下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta htt

中文字符-如何用C语言编写一个简单的输入法程序,要求可以输入汉字。

问题描述 如何用C语言编写一个简单的输入法程序,要求可以输入汉字. 不太清楚汉字在计算机中是如何存储的,想知道例如微软的智能ABC以及搜狗输入法是怎样实现拼音拼写下的汉字输入. 解决方案 首先要有一个汉字的编码库,比如GB2312编写的是拼音输入法的话,还要建立一个拼音与汉字对应的数据库然后根据用户输入的拼音,提示出对应的汉字(汉字的优先顺序由数据库决定,同时还可以学习该用户的使用习惯)如果输入法还支持智能联想输入的话,还要加入词库(也有优先级),这样可以根据前一个字来推断出下一个可能的字 解决

怎么用Java编写一个简单的登录系统?可以注册账号的那种

问题描述 怎么用Java编写一个简单的登录系统?可以注册账号的那种 数据库用的是MySQL,但Java操作方面的不知道怎么入手,求大神指点啊,有实例参考就更好了,谢谢 解决方案 import java.awt.event.*; import javax.swing.*; import java.awt.*; import java.awt.Container; import java.util.*; import java.sql.*; class Login extends JFrame im

pdf-求教:如何用c++编写一个简单的PDF文件检测工具?

问题描述 求教:如何用c++编写一个简单的PDF文件检测工具? 想编写一个在Windows下的用c++编写的程序能够检测PDF中是否有恶意代码,求高手帮忙. 解决方案 和编写防病毒软件类似,可以通过特征代码判断.先要建立一个特征库.

初学者 用visual studio中的C#编写一个简单的电子词典 在线等 求帮助

问题描述 初学者 用visual studio中的C#编写一个简单的电子词典 在线等 求帮助 求大神用visual studio2010帮忙编一个简单电子词典的程序,在线等 新人初学者求帮助 解决方案 很简单啊,写个数组就行了 解决方案二: 如果是像上面这样的电子词典,很容易解决.1.使用INI进行保存条目.(想要了解INI可以参考:http://www.cnblogs.com/Ray-chen/archive/2011/11/14/2248496.html)2.使用StreamWriter来读

sql-试编写一个简单SQL脚本程序,创建工资表并完成计算实发工资的任务。

问题描述 试编写一个简单SQL脚本程序,创建工资表并完成计算实发工资的任务. 假设有职工工资表:R(职工号,姓名,基本工资,附加工资,房租,水电,应发工资,税款,实发工资)缴纳个人所得税的规定如下:个人收入>5000,税率20%个人收入>2000,税率10%个人收入>800,税率5%个人收入<800,免税工资的计算方法:(1)应发工资=基本工资+附加工资(2)采取分段计算税款的算法,超出5000部分收20%,2000-5000之间部分收10%,以此类推.(3)实发工资=应发工资-税

Hadoop的环境搭建,和编写一个简单的hadoop job

hadoop 入门: 0hadoop的简要介绍 google之所以能够成功,一个重要的技术就是map-reduce.map-reduce是google为大规模的.分布式数据进行处理的一种编程模式. 而本文介绍的hadoop是apache的开源map-reduce实现.本文不过多的介绍map-reduce,主要精力放在hadoop的配置和编写一个简单的haoop程序上 对map-recude感兴趣的朋友可以进一步阅读参考文献. 1 hadoop服务器的安装: hadoop是一个分布式的处理框架,本

对象-什么意思,一直不知道,一个简单的计算器代码

问题描述 什么意思,一直不知道,一个简单的计算器代码 private void btnEqual_Click(object sender, EventArgs e) { C.Operation op = C.OperationFactory.CreateOperation(cbOperate.SelectedItem.ToString()); op.NumberA=Convert.ToDouble(txtA.Text); op.NumberB=Convert.ToDouble(txtB.Text