初识java:利用swing制作一个简单的计算器,仿造window10内置计算器标准模式下的界面。

涉及学习内容:

  1. 设置窗口
  2. 设计界面按键
  3. 设置文本框:只读
  4. String字符串操作:与double类型间的相互转换
  5. 设置字体属性
  6. 对计算器多种使用情况的考虑,如以加减法为例:
    1. 正常操作是输入一个数后按+号再按另一个数字:12+15
    2. 考虑使用者先按+号,那么应该该显示:0+,乘除则为1*;
    3. 考虑使用者按下+号键后反悔想使用减号;那么应当在还没输入另一个数值前进行更改:12+15+变12+15-,并且不影响结果
    4. 被除数不能为0。

在设计过程中需要不断对window10的计算器进行比较(可能有的win10已经没有内置计算器了),综合考虑所有可能出现的情况

本计算器不足之处:1、除的计算结果保留15位数

         2、定义double类型计算能力有限

         3、文本框长度不足,超出范围无法向win10一样滑动查看

         4、按下等于号后的操作有两种方式:1、按下运算符,对结果进行下一步的操作

                           2、全部初始化。本计算器只采用这一种

本源代码为本人原始设计思路,代码较长,许多类似代码可进行优化处理,仅供参考,初学Java,如有不足之处请多多指教。

package calculator;  //包名,根据自己创建的项目而定
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import javax.swing.JButton;//按键
import javax.swing.JFrame;//显示窗口
import javax.swing.JTextField;//文本框
import javax.swing.WindowConstants; public class show extends JFrame { ///主类show继承父类JFrame
private String[] ajm= { "%","√","X^2","1/X",
"ce","c","<<<","÷",
"7","8","9","*",
"4","5","6","-",
"1","2","3","+",
"+/-","0",".","=" };
private JButton Ajm[]=new JButton[ajm.length];//按键数组0-23
public JTextField t1=new JTextField();
public JTextField t2=new JTextField();//创建两个文本款用于显示输入以及计算结果的情况
String str=""; //存储输入的值,显示在下面文本框t2
String str1=""; //存储所有点击按键的结果显示于上面的文本框t1
double b=0; //存储计算结果用于下一步的计算
char ch=0; //存储运算符号用于下一步的计算
public void kuangjia() {
java.awt.Container c=getContentPane(); //容器
this.setTitle("计算器");//标题
this.setVisible(true);//表示可显示
setLayout(null);
setBounds(1000, 100,620, 900);//弹出宽高的大小,弹出的位置,左上角为00 for(int i=0;i<ajm.length;i++)
Ajm[i]=new JButton(ajm[i]);
//建立按键
int begin=0;
int bend=250;
for(int i=0;i<ajm.length;)//设计按键位置即界面显示效果
{ int j=0;
while(j<4)///搞定一行换一行
{
Ajm[i].setBounds(begin, bend, 150, 100);//按键的大小
Ajm[i].setFont(new java.awt.Font("宋体", Font.BOLD, 45));//按键显示的字体属性
c.add(Ajm[i]);//加入容器
i++;j++;
begin+=150;//根据窗口大小调整按键的位置
}
begin=0;bend+=100;
};
for(int i=8;i<19;i++)///设置数字按键的颜色为白
{
if(i==11||i==15)
i++;
Ajm[i].setBackground(Color.white);
}
Ajm[21].setBackground(Color.white);//由于0号键位置特殊,所以单独设置 ////////////上下两个文本框的属性设置
setLayout(null);
t1.setFont(new java.awt.Font("宋体", Font.BOLD, 40));
this.add(t1);
t1.setBounds(0,0,600,100);
t1.setEnabled(false); //只读
t1.setText("chengjunfeng");//显示内容 this.setLayout(null);
this.add(t2);
t2.setBounds(0,99,600,155);
t2.setFont(new java.awt.Font("宋体", Font.BOLD, 60));
t2.setEnabled(false); //只读
t2.setText("First calculator");
///建立监视器,表示当你按下这个按键将会执行什么
Ajm[0].addActionListener(new ajm0());//当0号键被按下,这个按键对应的就是%,将会执行ajm0这个类
Ajm[1].addActionListener(new ajm1());
Ajm[2].addActionListener(new ajm2());
Ajm[3].addActionListener(new ajm3());
Ajm[4].addActionListener(new ajm4());
Ajm[5].addActionListener(new ajm5());
Ajm[6].addActionListener(new ajm6());
Ajm[7].addActionListener(new ajm7());
Ajm[8].addActionListener(new ajm8());
Ajm[9].addActionListener(new ajm9());
Ajm[10].addActionListener(new ajm10());
Ajm[11].addActionListener(new ajm11());
Ajm[12].addActionListener(new ajm12());
Ajm[13].addActionListener(new ajm13());
Ajm[14].addActionListener(new ajm14());
Ajm[15].addActionListener(new ajm15());
Ajm[16].addActionListener(new ajm16());
Ajm[17].addActionListener(new ajm17());
Ajm[18].addActionListener(new ajm18());
Ajm[19].addActionListener(new ajm19());
Ajm[20].addActionListener(new ajm20());
Ajm[21].addActionListener(new ajm21());
Ajm[22].addActionListener(new ajm22());
Ajm[23].addActionListener(new ajm23()); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭方式
}
////这是一个有点特殊的类于加减乘除类相关,可先跳过这个类,看下面的类
class panduan{
public void pd(char a) {
if(a==0)//表示没有按运算键
if(str.length()==0)
b=0;//而且没有输入值,如直接按等于号,
else
b=Double.parseDouble(str);//有输入值按等于号
else
//考虑ch=加减乘除的四种情况,b作为计算结果显示在下面的文本框
switch ( a) {
case 43:
b += Double.parseDouble(str);
t2.setText(String.valueOf(b));
break;
case 45:
b -= Double.parseDouble(str);
t2.setText(String.valueOf(b));
break;
case 42:
b *= Double.parseDouble(str);
t2.setText(String.valueOf(b));
break;
case 47: double aa; aa= Double.parseDouble(str);
if(aa==0)
{
t2.setText("除数不能为0");
str1="";
str="";
b=0;
break;
}
b=(b/aa);
t2.setText(String.valueOf(b));
break;
}
}
}
//////%
class ajm0 implements ActionListener{
public void actionPerformed(ActionEvent arg0) { if(str1.length()==0)
{
t1.setText("0");
t2.setText("0");
str="";
return;
}//当什么都没有输入直接按的情况
else if(str.length()==0)
{
t1.setText(str1);
double t=b*b/100;
str=String.valueOf(t);
t1.setText(str1);
t2.setText(str);
}//有一定的输入后,即按了运算符号后还没输入值的情况,即对b进行操作
//12+12+这时候按下后应当是对24进行操作
else {
double dd=Double.parseDouble(str);
dd=b*dd/100;
str=String.valueOf(dd);
t1.setText(str1);
t2.setText(str);
}///否则则是对正使用下对输入值的转变24 变0.24
}
}
//√取开方 4√=2
class ajm1 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
if(str.length()==0)
{
t1.setText(str1);
double t=Math.sqrt(b);
str=String.valueOf(t);
t1.setText(str1);
t2.setText(str);
}
else {
double dd=Double.parseDouble(str);
dd=Math.sqrt(dd);;
str= String.valueOf(dd);
t1.setText(str1);
t2.setText(str); }
}
}
///取平方
class ajm2 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
if(str.length()==0)
{ t1.setText(str1);
double t=b*b;
str=String.valueOf(t); t1.setText(str1);
t2.setText(str);
}
else {
double dd=Double.parseDouble(str);
dd*=dd;
str= String.valueOf(dd); t1.setText(str1);
t2.setText(str);
}
}
}
//1/x
class ajm3 implements ActionListener{
public void actionPerformed(ActionEvent arg0) { if(str.length()==0)
{ t1.setText(str1);
double t=1/b;
str=String.valueOf(t); t1.setText(str1);
t2.setText(str);
}
else {
double dd=Double.parseDouble(str);
dd=1/dd;
str= String.valueOf(dd); t1.setText(str1);
t2.setText(str);
} }
}
///ce str清空 ,t2没显示
class ajm4 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
str="";
t2.setText(str); }
}
//把全部清空,即全部为初始状态
class ajm5 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
str="";
t2.setText(str);
str1="";
t1.setText(str1);
b=0;
ch=0;
}
}
///退格键,对刚输入的数字进行一个个删除操作,点一次删除一个
class ajm6 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
if(str.length()==0)
t2.setText("");//空的话删了也是空,所以显示空就对了 else {
char ss[]=str.toCharArray();//将str转化为数组进行操作 ss[str.length()-1]= 32; //32在acsii码中表示为空格,将要删除的数字变成空格
str= String.valueOf(ss);//重新将数组变成字符串
str=str.trim();//删除空格,这样最后面那个数就没有了str长度减一
t2.setText(str);//再显示出来比之前就少了一个,
//java应该有直接删除的方法只不过我不会,所以我的思路有点曲折
}//不为空,刚输入的数字还没删完
}
}
///÷号,刚才跳过的第一个类在这里就有用了
class ajm7 extends panduan implements ActionListener{//继承pandaun为父类,就可以调用他的方法pd
public void actionPerformed(ActionEvent arg0) {
int r;
r=str1.length();
if(r>0&&str.length()==0)//str1不为空,str为空,1;你刚输入的是数字12+15 2:你刚输入的是运算符12+15+
{
char a[]=str1.toCharArray();
if(a[r-1]<48||a[r-1]>57)//又是acsii码;判断最后一个是不是运算符
{
a[str1.length()-1]=47;
str1=String.valueOf(a);
t1.setText(str1);
ch=47;//是的话就把他变成除号/
return;
}
} if(str.length()==0)//下空
{str1=new String("0");
t2.setText("0");
}//初始状态按÷,
str1+=str+new String("÷"); //把str和运算符号加在str1后面,显示在t1,
t1.setText(str1);
this.pd(ch);//执行上一个运算符;
//也就是说在12+15后你按下÷,那么就执行上一个ch表示的运算符+后,b就变成27,下一个运算符变成/,再输入下一个值,下一次按运算符或=时,就执行27/你下一个输入的值
ch=47;
t1.setText(str1);
str="";//这时str没用了,就置空方便下次输入
}
}
//输入7,存在str字符串后面
class ajm8 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
str+=7;
t2.setText(str);
}
}
class ajm9 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
str+=8;
t2.setText(str);
}
}
class ajm10 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
str+=9;
t2.setText(str);
}
}
///*与÷类似
class ajm11 extends panduan implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
int r;
r=str1.length();
if(r>0&&str.length()==0)
{
char a[]=str1.toCharArray();
if(a[r-1]<48||a[r-1]>57)
{
a[str1.length()-1]=42;
str1=String.valueOf(a);
t1.setText(str1);
ch=42;
return;
}
}// if(str.length()==0)//下空
{str1=new String("1");
t2.setText("0");
b=1;
}//初始状态按*,
str1+=str+new String("*");
t1.setText(str1);
this.pd(ch);//执行上一个运算符;
ch=42;
t1.setText(str1);
str=""; }
}
class ajm12 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
str+=4;
t2.setText(str);
}
}
class ajm13 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
str+=5;
t2.setText(str);
}
}
class ajm14 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
str+=6;
t2.setText(str);
}
}
//减号与÷类似
class ajm15 extends panduan implements ActionListener{
public void actionPerformed(ActionEvent arg0) { int r;
r=str1.length();
if(r>0&&str.length()==0)
{
char a[]=str1.toCharArray();
if(a[r-1]<48||a[r-1]>57)
{
a[str1.length()-1]=45;
str1=String.valueOf(a);
t1.setText(str1);
ch=45;
return;
}
}// if(str.length()==0)//下空
{str1=new String("0");
t2.setText("0");
}//初始状态按-,
str1+=str+new String("-");
t1.setText(str1);
this.pd(ch);//执行上一个运算符;
ch=45;
t1.setText(str1);
str=""; }
}
class ajm16 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
str+=1;
t2.setText(str);
}
}
class ajm17 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
str+=2;
t2.setText(str);
}
}
class ajm18 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
str+=3;
t2.setText(str);
}
}
///加号与前面类似
class ajm19 extends panduan implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
int r;
r=str1.length();
if(r>0&&str.length()==0)
{
char a[]=str1.toCharArray();
if(a[r-1]<48||a[r-1]>57)
{
a[str1.length()-1]=43;
str1=String.valueOf(a);
t1.setText(str1);
ch=43;
return;
}
}/////对连续出现两个运算符号进行操作
if(str.length()==0)//下空
{str1=new String("0");
t2.setText("0");
}//初始状态按+,
str1+=str+new String("+");
t1.setText(str1);
this.pd(ch);//执行上一个运算符;
ch=43;
t1.setText(str1);
str="";
}
}
///正负转换,类似前面%
class ajm20 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
if(str.length()==0)
{
t1.setText(str1);
double t=-b;
str=String.valueOf(t);
t1.setText(str1);
t2.setText(str);
}
else {
double dd=Double.parseDouble(str);
str= String.valueOf(-dd);
t1.setText(str1);
t2.setText(str);
}
}
}
class ajm21 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
str+=0;
t2.setText(str);
}
}
class ajm22 implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
str+=".";
t2.setText(str);
}
}
//等号的操作
class ajm23 extends panduan implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
int r;
r=str1.length();
if(r>0&&str.length()==0)//类似前面;但是这里不是对ch进行重新赋值,而是直接输出b
{
char a[]=str1.toCharArray();
if(a[r-1]<48||a[r-1]>57)
{
t1.setText("0");
t2.setText(String.valueOf(b));
return;
}
}
this.pd(ch);
t1.setText("0");
str1="";
str="";
ch=0;
}//等于号之后全部归0,返回初始状态
}
public static void main(String[] args) {//主函数
show s=new show();
s.kuangjia();//直接定义主类的对象,调用方法就自动执行了
}
}
 

java 计算器的更多相关文章

  1. java 计算器SWT/RAP(版本3)键盘鼠标兼容

    java 计算器SWT/RAP(版本3)键盘鼠标兼容,之前版本也对,但存在线程失效问题,当多人访问时,就容易线程失效,一直犯得一个错误就是一直用static变量和static方法, 之前加了什么js界 ...

  2. 结对项目3-功能增强型带基本函数计算java计算器

    -----------------------------------------------------实验报告------------------------------------------- ...

  3. java计算器项目

    简单的java计算器项目   题目:java计算器项目 一. 题目简介: 一个能进行加减乘除四则运算的小程序 Github链接:https://github.com/lizhenbin/test/tr ...

  4. Java计算器的图形界面应用程序

      JAVA计算器的图形界面应用程序 题目简介: 整体分析: 实验代码: /*部分使用插件做界面*/ import java.awt.EventQueue; import javax.swing.JB ...

  5. Java计算器的简易实现(+-*/)

    java计算器的简易实现(+-*/) import java.util.Scanner; /* 写一个计算器 实现加减乘除四个功能 并且能够用循环接收新的数据,通过用户交互实现 写四个方法 + - * ...

  6. java设计之简单的JAVA计算器

    做这个东西主要是为了练习一下以前学习过的java Swing,所以那些复杂的算法就没有加载到里面去........ 先展示一下效果....,额,当然不是这个样子....   ---> 代码: p ...

  7. java计算器

       由于自己的实验报告 需要用Java来写一个实验报告.自己本没有怎么学过Java,但是学的话也就认真的学一下,毕竟技术这条路线是技多不压身.于是在网站上找来了一些资料,关于Java到底是干什么的, ...

  8. java计算器 图形用户界面 精简版

    package com.rgy.entity; import java.awt.*; import java.awt.event.*; @SuppressWarnings("serial&q ...

  9. Java计算器1.0版

    此版本只是设计了页面,还没有实现事件监听   代码: package com.niit.javagui; import java.awt.Button; import java.awt.FlowLay ...

  10. Java计算器(结对)

    一:题目简介 我们要做的是一个多功能计算器,Java程序编辑器是:图形界面.线程.流与文件等技术的综合应用. 图形界面的实现:考虑到简单.实用.高效等特点,就选择了Swing来完成实现,在选择组件上, ...

随机推荐

  1. [笨方法学python]习题51自动化测试笔记

    习题51 本节自动化测试部分看不大懂,自己每步都打印出来,帮助理解.(代码标红部分为自己加入调试为打印变量值所用) tests/tools.py from nose.tools import * im ...

  2. winapi创建不能改变大小的窗口

    HWND hWnd = CreateWindow( "myWindowClass", //窗口类的名字 "my first window", //窗口标题 // ...

  3. idea导入ssm javaweb maven项目

    本文笔者辛苦整理, 除了为方便大家贴的maven安装配置和方便的现有项目, 如转载请注明: https://www.cnblogs.com/m-yb/p/11229320.html idea导入ssm ...

  4. C#7.2 新增功能

    连载目录    [已更新最新开发文章,点击查看详细] C# 7.2 又是一个单点版本,它增添了大量有用的功能. 此版本的一项主要功能是避免不必要的复制或分配,进而更有效地处理值类型. C# 7.2 使 ...

  5. [剑指offer] 3. 从头到尾打印链表

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 利用容器,遍历一遍加入到一个新容器里,然后反置输出. vector 用 reverse stack 则直接一个个出栈 ...

  6. IBM RAD中集成Websphere启动后无法debug解决办法

    问题描述: IBM Rational Application Developer for WebSphere软件在启动WebSphere的时候无法以debug模式启动,debug启动后显示为start ...

  7. handlerAdapter与方法返回值的处理

    前提:处理器方法被调用并返回了结果 public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer ma ...

  8. GitLab与Git的结合

    作为一名刚入职的大数据初级开发工程师,来到公司后发现代码是部署在GItLab上,之前一直认为代码可以放在码云.github上面,然后就很迷惑就对GitLab进行了了解,将git 和gitlab结合起来 ...

  9. HttpsUtils

    package io.renren.modules.jqr.util; import java.io.BufferedReader; import java.io.InputStream; impor ...

  10. (转)Linux LVM逻辑卷配置过程详解(创建、扩展、缩减、删除、卸载、快照创建)

    一.预备知识 LVM全称为Logical Volume Manager 逻辑卷管理器,LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上.文件系统之下的一个逻辑层,可提高磁盘 ...