java简单计算器
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener; public class Calculator extends Frame implements ActionListener,MouseListener {
/**
* button上的名字
*/
private final String KEY[] = {"7","8" ,"9" ,"/" ,"4" ,"5" ,"6" ,"*" ,"1" ,"2" ,"3" ,"-" ,"0" ,"." ,"C" ,"+" ,"+/-" ,"%" ,"←" ,"=" };
/**
* 创建一个button数组
*/
private Button key[] = new Button[ KEY. length]; /**
* 计算结果的文本框
*/
private TextField tf = new TextField( "0");
/** 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字*/
private boolean firstNum = true;
/**计算的中间结果。*/
private double resultNum = 0.0;
/**当前运算的运算符*/
private String operator = "=";
/**操作是否合法*/
private boolean operateValidFlag = true; /**
* 创建布局以及添加组件
*/
public void additionLayout(){
//构造一个有标题的构造方法
Frame f = new Frame( "计算器");
//定义一个窗口事件监听器用于关闭窗口
f.addWindowListener( new MyWindowListener());
//放button的面板
Panel p = new Panel();
Panel p2 = new Panel();
//定义panel的布局方式
p.setLayout( new GridLayout(5,4,5,5));
p2.setLayout( new GridLayout(1,1,5,5));
//使文本框不可编辑
tf.setEditable( false); //用for循环创建button并加入到面板中
for( int i = 0;i< KEY. length;i++){
key[i] = new Button( KEY[i]);
key[i].setBackground(Color. cyan);
p.add( key[i]);
}
//为所有的button注册事件监听器
for ( int i = 0; i < KEY. length; i++) {
key[i].addActionListener( this);
key[i].addMouseListener( this);
}
tf.setPreferredSize( new Dimension(20,30));
p2.add( tf);
f.add(p,BorderLayout. CENTER);
f.add(p2,BorderLayout. NORTH);
f.setSize(333,235); //设置窗口大小
f.setLocation(550, 200); //设置窗口的初始位置
f.setResizable( false); //不可改变窗口大小
f.setVisible( true); //设置窗口可见
} /**
* 监听器处理事件
*/
@Override
public void actionPerformed(ActionEvent e) {
String label = e.getActionCommand();
if( "0123456789.".indexOf(label)>=0){
//用户按了数字键
handleNumber(label);
} else if(label.equals( KEY[14])){
//用户按了C键
handleC();
} else if (label.equals( KEY[18])) {
// 用户按了"Backspace"键
handleBackspace();
} else{
//用户按了运算符键
handleOperator(label);
}
}
/**
* 处理数字键与小数点被按下的事件
*
*/
private void handleNumber(String num){
if( firstNum){
//输入第一个数字
tf.setText(num);
} else if((num.equals( ".")) && (tf.getText().indexOf( ".") < 0)){
// 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面
tf.setText( tf.getText() + ".");
} else if(!num.equals( ".")){
// 如果输入的不是小数点,则将数字附在结果文本框的后面
tf.setText( tf.getText() + num);
} firstNum = false;
} /**
* 处理C键被按下的事件
*/
private void handleC(){
// 初始化计算器的各种值
tf.setText( "0");
firstNum = true;
operator = "=";
} /**
* 处理Backspace键被按下的事件
*/
private void handleBackspace() {
String text = tf.getText();
int i = text.length();
if (i > 0) {
// 退格,将文本最后一个字符去掉
text = text.substring(0, i - 1);
if (text.length() == 0) {
// 如果文本没有了内容,则初始化计算器的各种值
tf.setText( "0");
firstNum = true;
operator = "=";
} else {
// 显示新的文本
tf.setText(text);
}
}
} /**
* 处理运算符键被按下的事件
*/
private void handleOperator(String oper){
if ( operator.equals( "/")) {
// 除法运算
// 如果当前结果文本框中的值等于0
if (getNumberFromText() == 0.0) {
// 操作不合法
operateValidFlag = false;
tf.setText( "除数不能为零" );
} else {
resultNum /= getNumberFromText();
}
} else if ( operator.equals( "+")) {
// 加法运算
resultNum += getNumberFromText();
} else if ( operator.equals( "-")) {
// 减法运算
resultNum -= getNumberFromText();
} else if ( operator.equals( "*")) {
// 乘法运算
resultNum *= getNumberFromText();
} else if ( operator.equals( "=")) {
// 赋值运算
resultNum = getNumberFromText();
} else if ( operator.equals( "+/-")) {
// 正数负数运算
resultNum = resultNum * (-1);
} else if ( operator.equals( "%")) {
// 百分号运算,除以100
resultNum = resultNum / 100;
}
if ( operateValidFlag) {
// 双精度浮点数的运算
long t1;
double t2;
t1 = ( long) resultNum;
t2 = resultNum - t1;
if (t2 == 0) {
tf.setText(String. valueOf(t1));
} else {
tf.setText(String. valueOf(resultNum));
}
}
// 运算符等于用户按的按钮
operator = oper;
firstNum = true;
operateValidFlag = true;
} /**
* 从文本框中获取数字
*/
private double getNumberFromText() {
double result = 0;
try { //异常捕获
result = Double.valueOf(tf.getText()).doubleValue();
} catch (NumberFormatException e) {
}
return result;
} //鼠标进入按钮时变为黄色
@Override
public void mouseEntered(MouseEvent e) {
Button b = (Button)e.getSource();
b.setBackground(Color. yellow);
}
//鼠标离开按钮时恢复颜色
@Override
public void mouseExited(MouseEvent e) {
Button b = (Button)e.getSource();
b.setBackground(Color. CYAN);
}
//鼠标在按钮上按下时变为红色
@Override
public void mousePressed(MouseEvent e) {
Button b = (Button)e.getSource();
b.setBackground(Color. red);
}
//鼠标在按钮上释放时恢复颜色
@Override
public void mouseReleased(MouseEvent e) {
Button b = (Button)e.getSource();
b.setBackground(Color. CYAN); } @Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub } /**
* 测试类
*
*/
public static void main(String[] args) {
Calculator c = new Calculator();
c.additionLayout();
} }
Calculator
java简单计算器的更多相关文章
- java 简单计算器
package com.direct.demo; import java.text.DecimalFormat; import java.util.Scanner; public class Calc ...
- [Java.web]简单计算器
项目的 WebRoot 目录下的 calculator.jsp <%@ page language="java" import="java.util.*" ...
- 菜鸟学Android编程——简单计算器《一》
菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...
- JavaWeb学习记录(二十)——Model1模式(javaBean+jsp)实现简单计算器案例
¨JSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为: ¨<jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件. ¨< ...
- hiho #1332 : 简单计算器 栈+递归
#1332 : 简单计算器 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 编写一个程序可以完成基本的带括号的四则运算.其中除法(/)是整除,并且在负数除法时向0取整.( ...
- hdoj 1237 简单计算器
简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- HDOJ 1237题 简单计算器
简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...
- Ext实现简单计算器
以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!少帅的博客 使用Ext实现简单计算器,网页版实现 1.页面部分calculator. ...
- hdu 1237 简单计算器(栈处理)
简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
随机推荐
- C#字符串的方法
static void Main(string[] args) { StrMethod(); } public static void StrMethod() { string myString = ...
- 16.语句include和require的区别是什么?为避免多次包含同一文件,可用(?)语句代替它们?
require->require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行 require include->include有返回值,而require没 ...
- 2.MongoDB数据库简介
1).简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. mongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...
- NIO SelectionKey中定义的4种事件
SelectionKey.OP_ACCEPT —— 接收连接继续事件,表示服务器监听到了客户连接,服务器可以接收这个连接了 SelectionKey.OP_CONNECT —— 连接就绪事件,表示客户 ...
- [原创]在使用SDK 23(6.0)版本后org.apache.http相关的类找不到的解决办法
参考: http://stackoverflow.com/questions/32153318/httpclient-wont-import-in-android-studio http://www. ...
- C# socket通信
最近在研究socket,今天看到很好的一篇关于socket通信的文章,故收藏了,慢慢琢磨. 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: 1.TCP/IP层次模型 当然这里 ...
- Entity Framework7 有哪些不同?现在开发到什么程度了?
Entity Framework7之开篇 一.Entity Framework7 简介 Entity Framework7简称EF7,是微软正在开发的最新的在.NET应用中首选的数据访问技术.它是轻量 ...
- 报表控件NCreport教程:报表高级设计
本次文章中将讲解NCreport一些高级功能的应用,我们会先定义一个组,接下来会添加summary变量到示例报表中. 一.对summary添加变量 对于提供的数量和总量来说,变量是特殊的数值项,它们每 ...
- 关于mysql的几个必知点
实际运用中遇到的才了解到的 导出sql文件时navicat导出的sql文件形式是一条记录一个insert语句,所以文件会比较大点,后续插入也会比较慢,而用mysqldump命令导出的sql文件会合并插 ...
- ruby第一次实践 ”hello world“
下载ruby https://rubyinstaller.org/downloads/ 创建 ruby-version 写自己的版本 写Gemfile source: http://ruby.ta ...