计算器

作者: 百合_b06b | 来源:发表于2019-02-16 23:31 被阅读0次

    一、项目分析

    本程序主要练习使用布局管理器设计一个计算器的界面,并练习使用事件监听器处理数据的输入,并完成相关的计算操作。利用GUI知识通设计一个计算机图形界面,且计算器应用程序可以完成加、减、乘、除运算,且有小数点、退格和清零功能以及由自己想象发挥新增的功能等。

    二、设计思路

    该项目选择基于awt应用程序继承自框架类(Frame),此程序使用Frame布局管理器BorderLayout,将单行文本框加入到“North”区域,包含各种按钮的面板Panel p加入到”Center”区域。包含各种按钮的面板Panel p采用6行4列的GridLayout网格布局,为面板按钮等设置颜色,然后利用for循环将数字按钮和运算符按钮以及控制按钮添加到面板中。同时注册按钮事件监听器。如:Button ba=new Button();   b.addActionListener(事件监听器);此外,由自己发挥想象,还给各按钮注册键盘事件监听。如:KeyAction ka = new KeyAction(); b1[i].addKeyListener(ka);

    事件监听器中的事件处理方法void actionPerformed(ActionEvent e)完成主要的按钮事件的处理以及键盘事件监听器中监听某键被释放时执行的方法void keyTyped(KeyEvent e) 完成主要的键盘事件的处理。由生活中计算器所具有的功能,以及自己发挥想象将事件处理分以下几种情况:数字按钮事件(”0”,”1”,”2”…”8”,”9”)、根号键按钮处理("sqrt")、平方、立方按钮事件(“²”,“ɜ”)、运算符按钮事件(“+”,”-“,”*”,”/”,”%”)、正负号按钮事件(”+/-“)、小数点按钮事件(”.”)、等号按钮事件(”=”)、求倒按钮事件(”1/x”)、退格按钮事件(”退格”)、清楚按钮事件(“C”)、关闭按钮事件(“OFF”),还有一些由自己增加的事件功能。如:获取当前系统时间的按钮事件(“time”)。最后再完善监听事件所要用到的方法。

    三、设计步骤

    四,总体设计

    根据前面所给的设计步骤,将很明确每一步所要完成的设计,此时就可以根据所学知识完成各个步骤,以下将详细介绍各层次设计的实现:

    (一)界面设计

        1. 声明文本栏控件,用于显示计算结果:private TextField txtResult;

        2.创建面板p,用来存放按钮:private Panel p;

        3.声明过程过所要用的变量,定义一个存放计算结果的变量:return,并初始化为0;

        4. 定义一个字符串数组,将计算机中按钮的文字都存放在该数组中,按钮中的文字代表了该按钮所要执行的功能。

        5.调用父类中的方法给窗口命名,并设置窗口大小,且设置窗口大小不允许修改等,相关代码如下:

    super("Team计算机");     //调用父类构造方法Frame(String title);方法

    this.setSize(400,350);    //设置窗口大小

    this.setResizable(false);      //窗口大小不允许修改

    this.setLocation(100,200); //将组件移到新位置指定在左上角的位置显示

        6.该计算机设置了两个实现窗口关闭的位置,一个是窗口默认的位置由以下方法实现:

    //实现关闭窗口方法

    addWindowListener(new WindowAdapter(){

    public void windowClosing(WindowEvent e) {

    System.exit(0);

    }

    });

    另一个是通过按钮监听“OFF”键控制窗口的关闭,实则都是利用System.exit(0);来实现关闭窗口。

        7. 实例化面板,同时设置此面板的布局为6行4列的网格布局,给面板、按钮等美化设置颜色,利用for循环将按钮数组实例化,并注册按钮、键盘监听,同时将按键增加到面板中。

    //实例化面板对象,同时设置此面板的布局为6行4列得网格布局

    p = new Panel(new GridLayout(6,4,2,2));

    //将该面板放置在在窗体框架(边界布局)的中部

    this.add(p,BorderLayout.CENTER);

    //设置面板的背景颜色为橘色

    p.setBackground(Color.orange);

    //设置文字颜色

    p.setForeground(Color.blue);

    for(int i = 0;i<b1.length;i++) {

    b1[i] = new Button(name[i]); // 循环实例化按钮对象数组

    b1[i].setBackground(Color.CYAN); //设置按钮的背景颜色为青色

    b1[i].addActionListener(ba); //注册按钮监听

    b1[i].addKeyListener(ka); //注键盘监听

    p.add(b1[i]); //将按键增加到面板

    }

        8. 最终设计所得的界面如下:

    (二)事件监听

    首先完善单击按钮监听事件,然后再完善键盘监听事件。为每个控件所要表达的功能写一个方法。这些方法就是完成数学表达式的关键。事件监听用到getActionCommand()来获取事件对象,键盘监听用到getKeyChar()来获取键盘监听对象。以下为相关代码:

        1. 按钮监听事件:

    //--------单击按钮监听处理事件----------------------

    private class ButtonAction implements ActionListener{

    public void actionPerformed(ActionEvent e) {

    String input = e.getActionCommand(); //获取事件对象

    if(input.equals(name[0])) {

     Sqrt();

    }else if(input.equals(name[1])) {

    Square();

    }else if(input.equals(name[2])) {

    Backspace();

    }else if(input.equals(name[3])) {

    C();

    }else if(input.equals("+")){

    add();

    }else if(input.equals(name[4])){

    txtResult.setText(String.valueOf(new Date())); //获取系统时间

    }else if(input.equals(name[5])) {

    lifang();

    }else if(input.equals(name[6])) {

    percentage();

    }else if(input.equals(name[7])) {

    System.exit(0); //设置关闭系统

    }else if(input.equals("=")) {

    equal();

    }else if(input.equals("-")) {

    jian();

    }else if(input.equals("*")) {

    chen();

    }else if(input.equals("/")) {

    chu();

    }else{

    number(input);

    }

    }

    }

    //--------单击按钮监听处理事件-------------------------------------

        1.键盘监听事件:

    //--------键盘监听-------------------------------------

    private class KeyAction extends KeyAdapter implements KeyListener{

    public void keyTyped(KeyEvent e) {

    char key = e.getKeyChar();

    //敲击的键盘是数字

    if(key =='0' || key =='1' || key =='2' || key =='3' || key =='4' || key =='5' || key =='6' || key =='7' || key =='8' || key =='9') {

    if(start) {

    txtResult.setText("");

    start = false;

    }

    txtResult.setText(txtResult.getText() + key);

    }

    //敲击的键盘是操作符号

    else if(key == '+' || key == '-' || key == '*' || key == '/' || key == '=' || key == 'C' ||key =='\b' ) {

    if(start) {

    if(key =='-') {

    jian();

    start = false;

    }else if(key == '+'){

    add();

    start = false;

    }else if( key == '*') {

    chen();

    start = false;

    }else if(key == '/') {

    chu();

    }else if(key =='\b') {

    Backspace();

    }else if(key =='C') {

    C();

    }

    }else {

    equal() ;

    start = true;

    }

    }

    }

    }

    //--------键盘监听-------------------------------------

        (三)功能设计

    功能设计中的思路是先将按钮所监听到的事件转换成文本附在文本控制件中以文本形式展现,其中用到文本控件里的setText()方法设置文本内容显现,getText()方法来获取文本内容,以及lang包下的String.valueOf()方法用来把结果转换为String类型从而储存到文本栏中。再利用split()截取文本框内容的数字存放到一个数组中,并将其转换成double类型,然后再进行数学计算,用result变量来储存运算的结果,最后再次让结果以文本形式显示在文本控制栏里。

    该项目的设计是以实现同种符号的运算为主,而不能实现数学运算中的混合运算。各个功能的详细介绍及相关代码和功能展示如下:

        1. 根号键处理

    根号键将输入的数字做开更号处理,将处理后的数字呈现在文本栏中,并可进行下一个运算操作,相关代码如下:

    //--------根号键处理----------------

    private void Sqrt() {

    result =  Double.parseDouble(txtResult.getText()); //把获取文本框内容转化成Double型

    result = Math.sqrt(result );

    txtResult.setText(String.valueOf(result)); //String.valueOf() 指把结果转换为String类型

    result=0;

    }

    //--------根号键处理---------------

        2.平方、立方处理

    平方、立方键是将文本所得的数字分别平方和立法,实现数学的运算,相关代码如下:

    //--------平方键处理----------------------------

    private void Square() {

    result =  Double.parseDouble(txtResult.getText()); //把获取文本框内容转化成Double型

    result *=result;

    txtResult.setText(String.valueOf(result)); //String.valueOf() 指把结果转换为String类型

    result=0;

    }

    //--------平方键处理----------------------------

    //--------立方键处理----------------------------

    private void lifang() {

    result =  Double.parseDouble(txtResult.getText()); //把获取文本框内容转化成Double型

    result *=result*result;

    txtResult.setText(String.valueOf(result)); //String.valueOf() 指把结果转换为String类型

    result=0;

    }

    //--------立方键处理----------------------------

        3.%键处理

    %在数学运算中等同于将数字缩小一百倍,相关代码如下:

    //--------%键处理----------------------------

    private void percentage() {

    result =  Double.parseDouble(txtResult.getText()); //把获取文本框内容转化成Double型

    result /=100;

    txtResult.setText(String.valueOf(result)); //String.valueOf() 指把结果转换为String类型

    result=0;

    }

    //--------%键处理----------------------------

        4.退格键处理

    Backspace退格键处理是计算器中用来解决用户在途中当前输入错误想退格解决的问题,相关代码如下:

    //--------退格键处理----------------

    private void Backspace() {

    String text = txtResult.getText(); //getText()获取文本框内容

    int i = text.length();

    if(i>0) {

    text = text.substring(0, i-1); //退格,将文本最后一个字符串去掉

    if(text.length() == 0) { //若文本没了内容,则初始化文本值为0

    txtResult.setText("0");

    start =true;

    }else {

    txtResult.setText(text); //显示新文本

    }

    }

    }

    //--------退格键处理----------------

        5.C键清空处理

    C键清空处理主要用于一次计算完成,想计算下一次运算时对上次运算的清空处理,设计思路是将文本初始化为0,并将储存运算结果的result初始化为0,从而清空上一步的结果记录,相关代码如下:

    //--------C键处理----------------------------

    private void C() {

    txtResult.setText(txtResult.getText());

    txtResult.setText("0"); //初始化文本值为0

    start = true;

    result=0;

    }

    //--------C键处理------------------------------

        6. 运算键+处理

    运算符键+是用来实现数学加法运算的功能,但要等到最终结果还需借助等号键才能真正实现计算,其他运算符也一样,相关代码如下:

    //--------运算键+处理------------------------------

    private void add() {

    txtResult.setText(txtResult.getText()+"+");

    }

    //--------运算键+处理-----------------------------

    效果演示:

        7.运算符-执行

    实现减法运算,这里的运算都可以实现多数运算,相关代码如下:

    //--------运算符-执行---------------

    private void jian() {

    txtResult.setText(txtResult.getText()+"-");

    }

    //--------运算符-执行---------------

    效果演示:

        8.运算符*执行

    运算符*执行,由自身考虑,多设置了一个判断用户输入的第一个数字是否为0的功能,如果为0,它将以文本形式提示“零乘任何数都为零”,从而减少用户接下来数据输入的繁琐,其中用到了lang包下的contains()方法来判断输入的文本中是否含有*运算符,实则是判断当前文本是否是输入的第一个数字,相关代码如下:

    //--------运算符*执行-----------------------------

    private void chen() {

    if(!txtResult.getText().contains("*")){

    Double x = Double.parseDouble(txtResult.getText()); //把获取文本框内容转化成Double型

    if(x == 0.0) {

    start =false;

    txtResult.setText("零乘任何数都为零");

    }else {

    txtResult.setText(txtResult.getText()+"*");

    }

    }else {

    txtResult.setText(txtResult.getText()+"*");

    }

    }

    //--------运算符*执行-----------------------------

    效果演示:

    若一开始输入0,再按下该运算符键,文本将呈现以下效果:

    若不是0的话,它将为你进行数学乘法运算:

        9. 运算符/执行

    该运算同样设置了一个功能来提示输入的第一个数字是否为0,从而给予提示,相关代码如下:

    //--------运算符/执行---------------

    private void chu() {

    if(!txtResult.getText().contains("/")){

    Double x = Double.parseDouble(txtResult.getText()); //把获取文本框内容转化成Double型

    if( x==0.0) {

    start =false;

    txtResult.setText("零除任何不为零的数都为零,且除数不能为零"); //若除数为0,初始化文本值

    }else {

    txtResult.setText(txtResult.getText()+"/");

    }

    }else {

    txtResult.setText(txtResult.getText()+"/");

    }

    }

    //--------运算符/执行---------------

    效果演示:

    若一开始输入0,再按下该运算符键,文本将呈现以下效果:

    若不是0的话,它将为你进行数学除法运算:

        10. 数字处理

    数字处理键处理了按下0——9按钮的事件,同时还处理了小数点的按钮控件,利用lang包下的indexOf()方法来判断所输入的数字之前是否有小数点,如果没有则将输入的小数点附在文本框后面,若有小数点的话,将不进行处理,此方法赋予计算器进行小数之间的运算,相关代码如下:

    //--------数字处理-----------------------------

    private void number(String y) {

    if(start) {

    txtResult.setText(y); //设置文本框显示内容

    start = false;

    }else if(y.equals(".")&&(txtResult.getText().indexOf(".")<0)) { //输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框后面

    txtResult.setText(txtResult.getText() + "."); //getText()获取文本框内容

    }else if(!y.equals(".")) {

    txtResult.setText(txtResult.getText()+y); //如果输入的不是小数点,则将数字附在结果文本框的后面

    }

    start = false;

    }

    //--------数字处理-----------------------------

    效果演示:

        11.等号处理

    等号处理是将真正实现其它运算符的关键,只有按下这个按钮,执行该方法才算真正进行了数据间的运算,其中用到split()方法来实现截取文本中的数字,相关代码如下:

    //--------等于输出----------------

    private void equal() {

     txtResult.getText(); //getText()获取文本框内容

    if(txtResult.getText().contains("+")){

    String []aa=txtResult.getText().split("\\+"); //split()截取文本框内容的数字

    for(int i=0;i<aa.length;i++) {

    result +=Double.parseDouble(aa[i].toString()); //把获取文本框内容转化成Double型

    }

    txtResult.setText(txtResult.getText()+"="+result); //String.valueOf() 指把结果转换为String类型

    }else if(txtResult.getText().contains("-")) {

    String []aa=txtResult.getText().split("\\-"); //split()截取文本框内容的数字

    for(int i=0;i<aa.length;i++) {

    if(i==0) {

    result = Double.parseDouble(aa[i].toString());

    }else {

    result -=Double.parseDouble(aa[i].toString()); //把获取文本框内容转化成Double型

    }

    }

    txtResult.setText(txtResult.getText()+"="+String.valueOf(result)); //String.valueOf() 指把结果转换为String类型

    }else if(txtResult.getText().contains("*")) {

    String []aa=txtResult.getText().split("\\*"); //split()截取文本框内容的数字构成一个数组

    for(int i=0;i<aa.length;i++) {

    if(i==0) {

    result = Double.parseDouble(aa[i].toString());

    }else {

    result *=Double.parseDouble(aa[i].toString()); //把获取文本框内容转化成Double型

    }

    }

    txtResult.setText(txtResult.getText()+"="+String.valueOf(result)); //String.valueOf() 指把结果转换为String类型

    }else if(txtResult.getText().contains("/")) {

    String []aa=txtResult.getText().split("\\/"); //split()截取文本框内容的数字

    for(int i=0;i<aa.length;i++) {

    if(i==0) {

    result = Double.parseDouble(aa[i].toString());

    }else {

    result /=Double.parseDouble(aa[i].toString()); //把获取文本框内容转化成Double型

    }

    }

    txtResult.setText(txtResult.getText()+"="+result); //String.valueOf() 指把结果转换为String类型

    }

    }

    //--------等于输出----------------

        12.“time”键处理

    该键是由自己想象添加的一个功能键方法,加载import java.util.Date;来实现new Date()方法,从而获取当前系统时间。

    效果演示:

    (二)问题解决

    在该项目的设计过程中,遇到一些问题,但最终经过查阅资料都得以解决,在此详细介绍在两个设计中遇到的比较突出的问题,并得以解决。

        1.将数据进行根号,平方或立方处理后,再进行符号运算时,所得结果错误,

    错误原因:

    在计算中result仍记录着之前的结果,因此如果进行下一个运算符计算,他将以上一步的结果继续赋予本次运算中,因此所得的结果不对。

    解决方法:

    在操作完该方法,将所得文本附在文本后,再初始化result储存的结果为0,将不会再记录之前操作的结果。

        2. 等号无法实现

    错误原因:

    文本数字的获取,一开始只想着将文本中的内容从string类型转换成double类型,从而忽略了文本中还含有运算符等字符,将无法把它进行转换。

    解决办法:

    用split()方法截取文本框内容的数字构成一个数组,并将其转换成double类型,再进行运算。

    五,程序清单

    package Teamcalculator;

    import java.awt.*;

    import java.awt.event.*;

    import java.util.Date;

    public class MyCalculator extends Frame {

    //声明一个文本栏控件,用于显示计算结果

    private TextField txtResult;

    //创建一个面板

    private Panel p;

    //序列化时使用的,实现了serializable接口。

    private static final long serialVersionUID = 1L;

    //定义一个字符串数组,将计算机中按钮的文字都放在该数组中

    private String name[] = {"sqrt","²", "Backspace","C","time","ɜ","%","OFF","7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/"};

    //声明一个按钮数组,该按钮数组的长度等于字符串数组的长度

    private Button b1[] = new Button[name.length];

    //定义一个存放计算结果的变量,初始为0

    private double result = 0 ;

    //定义标识是否开始

    private boolean start = true;

    public MyCalculator() {

    super("Team计算机");        //调用父类构造方法Frame(String title);方法

    this.setSize(400,350);    //设置窗口大小

    this.setResizable(false);      //窗口大小不允许修改

    this.setLocation(100,200); //将组件移到新位置指定在左上角的位置显示

    //实现关闭窗口方法

    addWindowListener(new WindowAdapter(){

    public void windowClosing(WindowEvent e) {

    System.exit(0);

    }

    });

    txtResult = new TextField(40);   //实例化一个长度为40px的文本框组件             

    txtResult.setFocusable(false);   //设置文本框不是焦点状态       

    this.add(txtResult,BorderLayout.NORTH); //将文本框控件放置在窗体框架(边界布局)的北部

    //实例化面板对象,同时设置此面板的布局为6行4列得网格布局

    p = new Panel(new GridLayout(6,4,2,2));

    //将该面板放置在在窗体框架(边界布局)的中部

    this.add(p,BorderLayout.CENTER);

    //设置面板的背景颜色为橘色

    p.setBackground(Color.orange);

    //设置文字颜色

    p.setForeground(Color.blue);

    ButtonAction ba = new ButtonAction(); //实例化按钮监听对象

    KeyAction ka = new KeyAction(); //实例化键盘监听对象

    for(int i = 0;i<b1.length;i++) {

    b1[i] = new Button(name[i]); // 循环实例化按钮对象数组

    b1[i].setBackground(Color.CYAN); //设置按钮的背景颜色为青色

    b1[i].addActionListener(ba); //注册按钮监听

    b1[i].addKeyListener(ka); //注键盘监听

    p.add(b1[i]); //将按键增加到面板

    }

    }

    //--------单击按钮监听处理事件----------------------

    private class ButtonAction implements ActionListener{

    public void actionPerformed(ActionEvent e) {

    String input = e.getActionCommand(); //获取事件对象

    if(input.equals(name[0])) {

     Sqrt();

    }else if(input.equals(name[1])) {

    Square();

    }else if(input.equals(name[2])) {

    Backspace();

    }else if(input.equals(name[3])) {

    C();

    }else if(input.equals("+")){

    add();

    }else if(input.equals(name[4])){

    txtResult.setText(String.valueOf(new Date())); //获取系统时间

    }else if(input.equals(name[5])) {

    lifang();

    }else if(input.equals(name[6])) {

    percentage();

    }else if(input.equals(name[7])) {

    System.exit(0); //设置关闭系统

    }else if(input.equals("=")) {

    equal();

    }else if(input.equals("-")) {

    jian();

    }else if(input.equals("*")) {

    chen();

    }else if(input.equals("/")) {

    chu();

    }else{

    number(input);

    }

    }

    }

    //--------单击按钮监听处理事件-------------------------------------

    //--------根号键处理----------------

    private void Sqrt() {

    result =  Double.parseDouble(txtResult.getText()); //把获取文本框内容转化成Double型

    result = Math.sqrt(result );

    txtResult.setText(String.valueOf(result)); //String.valueOf() 指把结果转换为String类型

    result=0;

    }

    //--------根号键处理----------------

    //--------平方键处理----------------------------

    private void Square() {

    result =  Double.parseDouble(txtResult.getText()); //把获取文本框内容转化成Double型

    result *=result;

    txtResult.setText(String.valueOf(result)); //String.valueOf() 指把结果转换为String类型

    result=0;

    }

    //--------平方键处理----------------------------

    //--------立方键处理----------------------------

    private void lifang() {

    result =  Double.parseDouble(txtResult.getText()); //把获取文本框内容转化成Double型

    result *=result*result;

    txtResult.setText(String.valueOf(result)); //String.valueOf() 指把结果转换为String类型

    result=0;

    }

    //--------立方键处理----------------------------

    //--------%键处理----------------------------

    private void percentage() {

    result =  Double.parseDouble(txtResult.getText()); //把获取文本框内容转化成Double型

    result /=100;

    txtResult.setText(String.valueOf(result)); //String.valueOf() 指把结果转换为String类型

    result=0;

    }

    //--------%键处理----------------------------

    //--------退格键处理----------------

    private void Backspace() {

    String text = txtResult.getText(); //getText()获取文本框内容

    int i = text.length();

    if(i>0) {

    text = text.substring(0, i-1); //退格,将文本最后一个字符串去掉

    if(text.length() == 0) { //若文本没了内容,则初始化文本值为0

    txtResult.setText("0");

    start =true;

    }else {

    txtResult.setText(text); //显示新文本

    }

    }

    }

    //--------退格键处理----------------

    //--------C键处理----------------------------

    private void C() {

    txtResult.setText(txtResult.getText());

    txtResult.setText("0"); //初始化文本值为0

    start = true;

    result=0;

    }

    //--------C键处理------------------------------

    //--------等于输出----------------

    private void equal() {

     txtResult.getText(); //getText()获取文本框内容

    if(txtResult.getText().contains("+")){

    String []aa=txtResult.getText().split("\\+"); //split()截取文本框内容的数字

    for(int i=0;i<aa.length;i++) {

    result +=Double.parseDouble(aa[i].toString()); //把获取文本框内容转化成Double型

    }

    txtResult.setText(txtResult.getText()+"="+result); //String.valueOf() 指把结果转换为String类型

    }else if(txtResult.getText().contains("-")) {

    String []aa=txtResult.getText().split("\\-"); //split()截取文本框内容的数字

    for(int i=0;i<aa.length;i++) {

    if(i==0) {

    result = Double.parseDouble(aa[i].toString());

    }else {

    result -=Double.parseDouble(aa[i].toString()); //把获取文本框内容转化成Double型

    }

    }

    txtResult.setText(txtResult.getText()+"="+String.valueOf(result)); //String.valueOf() 指把结果转换为String类型

    }else if(txtResult.getText().contains("*")) {

    String []aa=txtResult.getText().split("\\*"); //split()截取文本框内容的数字构成一个数组

    for(int i=0;i<aa.length;i++) {

    if(i==0) {

    result = Double.parseDouble(aa[i].toString());

    }else {

    result *=Double.parseDouble(aa[i].toString()); //把获取文本框内容转化成Double型

    }

    }

    txtResult.setText(txtResult.getText()+"="+String.valueOf(result)); //String.valueOf() 指把结果转换为String类型

    }else if(txtResult.getText().contains("/")) {

    String []aa=txtResult.getText().split("\\/"); //split()截取文本框内容的数字

    for(int i=0;i<aa.length;i++) {

    if(i==0) {

    result = Double.parseDouble(aa[i].toString());

    }else {

    result /=Double.parseDouble(aa[i].toString()); //把获取文本框内容转化成Double型

    }

    }

    txtResult.setText(txtResult.getText()+"="+result); //String.valueOf() 指把结果转换为String类型

    }

    }

    //--------等于输出----------------

    //--------运算键+处理------------------------------

    private void add() {

    txtResult.setText(txtResult.getText()+"+");

    }

    //--------运算键+处理-----------------------------

    //--------运算符-执行---------------

    private void jian() {

    txtResult.setText(txtResult.getText()+"-");

    }

    //--------运算符-执行---------------

    //--------运算符*执行-----------------------------

    private void chen() {

    if(!txtResult.getText().contains("*")){

    Double x = Double.parseDouble(txtResult.getText()); //把获取文本框内容转化成Double型

    if(x == 0.0) {

    start =false;

    txtResult.setText("零乘任何数都为零");

    }else {

    txtResult.setText(txtResult.getText()+"*");

    }

    }else {

    txtResult.setText(txtResult.getText()+"*");

    }

    }

    //--------运算符*执行-----------------------------

    //--------运算符/执行---------------

    private void chu() {

    if(!txtResult.getText().contains("/")){

    Double x = Double.parseDouble(txtResult.getText()); //把获取文本框内容转化成Double型

    if( x==0.0) {

    start =false;

    txtResult.setText("零除任何不为零的数都为零,且除数不能为零"); //若除数为0,初始化文本值

    }else {

    txtResult.setText(txtResult.getText()+"/");

    }

    }else {

    txtResult.setText(txtResult.getText()+"/");

    }

    }

    //--------运算符/执行---------------

    //--------数字处理-----------------------------

    private void number(String y) {

    if(start) {

    txtResult.setText(y); //设置文本框显示内容

    start = false;

    }else if(y.equals(".")&&(txtResult.getText().indexOf(".")<0)) { //输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框后面

    txtResult.setText(txtResult.getText() + "."); //getText()获取文本框内容

    }else if(!y.equals(".")) {

    txtResult.setText(txtResult.getText()+y); //如果输入的不是小数点,则将数字附在结果文本框的后面

    }

    start = false;

    }

    //--------数字处理-----------------------------

    //--------键盘监听-------------------------------------

    private class KeyAction extends KeyAdapter implements KeyListener{

    public void keyTyped(KeyEvent e) {

    char key = e.getKeyChar();

    //敲击的键盘是数字

    if(key =='0' || key =='1' || key =='2' || key =='3' || key =='4' || key =='5' || key =='6' || key =='7' || key =='8' || key =='9') {

    if(start) {

    txtResult.setText("");

    start = false;

    }

    txtResult.setText(txtResult.getText() + key);

    }

    //敲击的键盘是操作符号

    else if(key == '+' || key == '-' || key == '*' || key == '/' || key == '=' || key == 'C' ||key =='\b' ) {

    if(start) {

    if(key =='-') {

    jian();

    start = false;

    }else if(key == '+'){

    add();

    start = false;

    }else if( key == '*') {

    chen();

    start = false;

    }else if(key == '/') {

    chu();

    }else if(key =='\b') {

    Backspace();

    }else if(key =='C') {

    C();

    }

    }else {

    equal() ;

    start = true;

    }

    }

    }

    }

    //--------键盘监听-------------------------------------

    public static void main(String[] args) {

    MyCalculator calculator = new MyCalculator();

    calculator.setVisible(true); //Component类的setVisible(boolean b);方法设置部件是否可见

    }

    }

    六,设计心得

    通过本次设计中,真正了解到完成一个项目的基本流程,从中也收获了不少东西。

        1. 进一步了解Java开发的相关知识,具体认识和掌握Java项目实训的流程。

        2.通过本次设计,更加深刻的理解了Java图形用户界面开发的相关知识,并能合理运用与设计。

        3.通过这次课程设计,很多以前不明白的问题,现在更加的懂了,知道该如何去运用。

        4. 同时借助搜索查询,也学到了一些课本上没学到的知识,或了解到更简单的方法去处理同一个问题,这样可以更好的解决所存在的问题。

        5.现代社会发展快速,网络这方面的知识时时都在更新发展,想要做出与时俱进的网站,我们的学识也必须跟进时代,掌握新的知识。如图形用户界面开发中,我们可以用awt改良的swing包,能更加合理运用。

        6.通过本次设计,很好的帮我们回顾了所学知识,并运用于实例中。

        7. 同时,学会了不仅要掌握并利用所学知识,而且要联系生活实际,发挥自身想象,不断去完善项目的功能。

        8,本次设计中更重要的是学会了要勇于尝试的精神,不断的去改进,调试。

    七,改进方向

    通过该课程设计也发现了自己还存在很多问题有待于改进。

        1.对于一些知识还掌握的不够深刻,还需进一步了解。

        2. 因学识的限制,还有很多东西没学,导致无法实现真实项目的相应的功能。

        3. 因时间的限制,不能有充足的时间对项目进行详细的划分和规划,从而不能展现一个比较可观的项目。

        4.该项目没用跟进时代使用awt改良的swing包,而仅局限于awt包的知识。

        5.对于一些理论知识掌握的不够,还需加以牢记。

    八,参考文献

    [1]刘志宏.计算机网络十二五规划教程[M]. 北京:航空工业出版社,2008年2月

    [2]陆昌辉.  Java程序设计实用案例教程[M]. 北京:电子工业出版社,2008年

    [3]陈丹丹.  Java学习手册[M]. 北京:电子工业出版社,2011年

    [4]百度文献:https://blog.csdn.net/z8110/article/details/52734783/

    [5]百度知道:https://zhidao.baidu.com/question/439032054.html

    相关文章

      网友评论

          本文标题:计算器

          本文链接:https://www.haomeiwen.com/subject/vfablqtx.html