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 ...
随机推荐
- 这是用过的"最差"树形插件
这是用过的"最差"树形插件 !!! 或许大家听过一个bootstrap UI框架---ace皮肤.有兴趣的童鞋可以在线查看:https://www.iteblog.com/ac ...
- 写了placement new就要写placement delete
"placement new"通常是专指指定了位置的new(std::size_t size, void *mem),用于vector申请capacity剩余的可用内存. 但广义的 ...
- 论文阅读(Weilin Huang——【AAAI2016】Reading Scene Text in Deep Convolutional Sequences)
Weilin Huang--[AAAI2016]Reading Scene Text in Deep Convolutional Sequences 目录 作者和相关链接 方法概括 创新点和贡献 方法 ...
- win下命令行替代品Cmder
Cmder简单使用小结 Cmder是一款Windows环境下非常简洁美观易用的cmd替代者,它支持了大部分的Linux命令. 从官网下载下来一个zip安装包,解压之后运行根目录的Cmder.exe即可 ...
- Entity Framework7 入门之全功能.NET版本下使用EF7(含源码)另附数据迁移常见错误处理
Entity Framework7 入门之全功能.NET(Console, WinForms, WPF等)使用EF7 昨天,我们介绍了EF的新特性和开发计划,如果你还不了解,请移步 Entity Fr ...
- 解决Qualcomm Atheros AR8161 Gigabit Ethernet网卡Linux下坏掉的问题
我的戴尔(Dell)I2330R-168一体电脑的网卡在升级某个内核版本后,网卡就用一会儿就坏了 ifconfig eth0 eth0: flags=<UP,BROADCAST,RUNNING, ...
- JNI 翻译 转 Delphi 的 经验 方法
首发在 ①FireMonkey[移动开发] 16523232 欢迎使用 FMX 开发手机程序的高手来访. 注意:如果您看了本文,翻译了 JNI,请发布到本群共享一份.不同意本规定的,请立即删除本文.凡 ...
- asp.net 事件加载顺序
下面是母版页与内容页合并后事件的发生顺序: 母版页控件 Init 事件. 内容控件 Init 事件. 母版页 Init 事件. 内容页 Init 事件. 内容页 Load 事件. 母版页 Load 事 ...
- 基于CNN的人脸相似度检测
人脸相似度检测主要是检测两张图片中人脸的相似度,从而判断这两张图片的对象是不是一个人. 在上一篇文章中,使用CNN提取人脸特征,然后利用提取的特征进行分类.而在人脸相似度检测的工作中,我们也可以利用卷 ...
- EditText光标位置
1.xml中设置 gravity="top" 加入edittext框的高度不止一行时,该属性可是光标定位在第一行,不设置的话光标是默认在框的中间 2.etEdit.setSele ...