写的一个小计算器,留着以后看吧。
 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简单计算器的更多相关文章

  1. java 简单计算器

    package com.direct.demo; import java.text.DecimalFormat; import java.util.Scanner; public class Calc ...

  2. [Java.web]简单计算器

    项目的  WebRoot 目录下的 calculator.jsp <%@ page language="java" import="java.util.*" ...

  3. 菜鸟学Android编程——简单计算器《一》

    菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...

  4. JavaWeb学习记录(二十)——Model1模式(javaBean+jsp)实现简单计算器案例

    ¨JSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为: ¨<jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件. ¨< ...

  5. hiho #1332 : 简单计算器 栈+递归

    #1332 : 简单计算器 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 编写一个程序可以完成基本的带括号的四则运算.其中除法(/)是整除,并且在负数除法时向0取整.( ...

  6. hdoj 1237 简单计算器

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  7. HDOJ 1237题 简单计算器

    简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  8. Ext实现简单计算器

    以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!少帅的博客 使用Ext实现简单计算器,网页版实现 1.页面部分calculator. ...

  9. hdu 1237 简单计算器(栈处理)

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

随机推荐

  1. 这是用过的"最差"树形插件

      这是用过的"最差"树形插件 !!! 或许大家听过一个bootstrap UI框架---ace皮肤.有兴趣的童鞋可以在线查看:https://www.iteblog.com/ac ...

  2. 写了placement new就要写placement delete

    "placement new"通常是专指指定了位置的new(std::size_t size, void *mem),用于vector申请capacity剩余的可用内存. 但广义的 ...

  3. 论文阅读(Weilin Huang——【AAAI2016】Reading Scene Text in Deep Convolutional Sequences)

    Weilin Huang--[AAAI2016]Reading Scene Text in Deep Convolutional Sequences 目录 作者和相关链接 方法概括 创新点和贡献 方法 ...

  4. win下命令行替代品Cmder

    Cmder简单使用小结 Cmder是一款Windows环境下非常简洁美观易用的cmd替代者,它支持了大部分的Linux命令. 从官网下载下来一个zip安装包,解压之后运行根目录的Cmder.exe即可 ...

  5. Entity Framework7 入门之全功能.NET版本下使用EF7(含源码)另附数据迁移常见错误处理

    Entity Framework7 入门之全功能.NET(Console, WinForms, WPF等)使用EF7 昨天,我们介绍了EF的新特性和开发计划,如果你还不了解,请移步 Entity Fr ...

  6. 解决Qualcomm Atheros AR8161 Gigabit Ethernet网卡Linux下坏掉的问题

    我的戴尔(Dell)I2330R-168一体电脑的网卡在升级某个内核版本后,网卡就用一会儿就坏了 ifconfig eth0 eth0: flags=<UP,BROADCAST,RUNNING, ...

  7. JNI 翻译 转 Delphi 的 经验 方法

    首发在 ①FireMonkey[移动开发] 16523232 欢迎使用 FMX 开发手机程序的高手来访. 注意:如果您看了本文,翻译了 JNI,请发布到本群共享一份.不同意本规定的,请立即删除本文.凡 ...

  8. asp.net 事件加载顺序

    下面是母版页与内容页合并后事件的发生顺序: 母版页控件 Init 事件. 内容控件 Init 事件. 母版页 Init 事件. 内容页 Init 事件. 内容页 Load 事件. 母版页 Load 事 ...

  9. 基于CNN的人脸相似度检测

    人脸相似度检测主要是检测两张图片中人脸的相似度,从而判断这两张图片的对象是不是一个人. 在上一篇文章中,使用CNN提取人脸特征,然后利用提取的特征进行分类.而在人脸相似度检测的工作中,我们也可以利用卷 ...

  10. EditText光标位置

    1.xml中设置 gravity="top"  加入edittext框的高度不止一行时,该属性可是光标定位在第一行,不设置的话光标是默认在框的中间 2.etEdit.setSele ...