Java实验报告-计算器(AWT图形界面)

 

一、实验目的

掌握图形用户界面的设计与实现。

二、实验内容

使用图形界面制作一个计算器并实现相应功能。

三、实验步骤

public class firstapp extends Applet implements ActionListener {

    private String[] LEFTKEYS = { "7", "8", "9", "4", "5", "6", "1", "2", "3", "0", "+/-", "." };

    private String[] RIGHTKEYS = { "/", "sqrt", "ln", "*", "sin", "<-", "-", "cos", "CE", "+", "y^x", "=" };

    private Button leftKeys[] = new Button[LEFTKEYS.length];

    private Button rightKeys[] = new Button[RIGHTKEYS.length];

    private TextField resultText = new TextField("0");



    private double resultNum = 0.0;

    private String operator = "=";

    private boolean startInput = true;



    public firstapp() {

        init();

    }

   

    public void init() {

        resultText.setEditable(false);

        resultText.setBackground(Color.WHITE);

        Panel leftPanel = new Panel();// 左边按钮

        leftPanel.setLayout(new GridLayout(4, 3, 3, 3));

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

            leftKeys[i] = new Button(LEFTKEYS[i]);

            leftPanel.add(leftKeys[i]);

            leftKeys[i].setForeground(Color.RED);

        }

        Panel rightPanel = new Panel();

        rightPanel.setLayout(new GridLayout(4, 3, 3, 3));

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

            rightKeys[i] = new Button(RIGHTKEYS[i]);

            rightPanel.add(rightKeys[i]);

            rightKeys[i].setForeground(Color.blue);

        }

        this.setLayout(new BorderLayout());

        this.add(resultText, BorderLayout.NORTH);

        this.add(leftPanel, BorderLayout.WEST);

        this.add(rightPanel, BorderLayout.EAST);



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

            leftKeys[i].addActionListener(this);

        }

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

            rightKeys[i].addActionListener(this);

        }

    }



    public void actionPerformed(ActionEvent e) {

        // TODO 自动生成的方法存根

        String label = e.getActionCommand();

        if (label.equals(RIGHTKEYS[8])) {

            // 处理CE

            resultText.setText("0");

            startInput = true;

        } else if (label.equals(RIGHTKEYS[5])) {

            // 处理退格

            handleBackSpace();

        } else if ("0123456789.".indexOf(label) >= 0) {

            // 处理数字n

            handleNum(label);

        } else {

            // 处理运算符

            handleOperate(label); 

        }

    }



    private void handleBackSpace() {

        String text = resultText.getText();

        int i = text.length();



        text = text.substring(0, i - 1);

        if (text.length() == 0) {

            // 如果文本没有了内容,显示0

            resultText.setText("0");

        } else {

            // 显示新的文本

            resultText.setText(text);

        }

    }



    private void handleNum(String key) {

        if (startInput) {

            if (key.equals(".")) {

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

            } else {

                resultText.setText(key);

            }

        } else if ((key.equals(".")) && (resultText.getText().indexOf(".") < 0)) {



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

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

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

        }

        startInput = false;

    }



    private void handleOperate(String key) {

        if (key.equals(RIGHTKEYS[1]) || key.equals(RIGHTKEYS[2]) || key.equals(RIGHTKEYS[4]) || key.equals(RIGHTKEYS[7])

                || key.equals(LEFTKEYS[10])) {

            if (key.equals(RIGHTKEYS[1])) { // 处理sqrt

                if (getNumFromText() < 0.0) {

                   resultText.setText("小于0的数不能开方");

                } else {

                   resultNum = Math.sqrt(getNumFromText());

                }

            }



            if (key.equals(RIGHTKEYS[2])) { // 处理ln

                if (getNumFromText() <= 0.0) {

                   resultText.setText("小于等于0的数不能求对数");

                } else {

                   resultNum = Math.log(getNumFromText());

                }

            }

            if (key.equals(RIGHTKEYS[4])) { // 处理sin

                resultNum = Math.sin(getNumFromText());

            }



            if (key.equals(RIGHTKEYS[7])) { // 处理cos

                resultNum = Math.cos(getNumFromText());

            }

            if (key.equals(LEFTKEYS[10])) { // 处理+/-

                resultNum = getNumFromText() * (-1);

            }

            resultText.setText(String.valueOf(resultNum));

            startInput = true;

        }



        else {

            if (operator.equals("/")) {

                // 除

                if (resultText.getText().equals("0")) {

                   resultText.setText("除数不能为零");

                } else {

                   resultNum /= getNumFromText();

                }

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

                // 加

                resultNum += getNumFromText();

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

                // 减

                resultNum -= getNumFromText();

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

                // 乘

                resultNum *= getNumFromText();

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

                // 赋值

                resultNum = getNumFromText();

            } else if (operator.equals("y^x")) {

                // pow

                resultNum = Math.pow(resultNum, getNumFromText());

            }

            resultText.setText(String.valueOf(resultNum));

            operator = key;

            startInput = true;

        }

    }



    private double getNumFromText() {

        double textDouble;

        textDouble = Double.valueOf(resultText.getText()).doubleValue();

        return textDouble;

    }



    public static void main(String args[]) {

        firstapp firstapp1 = new firstapp();

        firstapp1.setVisible(true);

    }

}

四、实验总结

本次实验使我学会了如何实现图形用户界面,知道了awt各组件的相关参数、窗口的布局等相关知识。明白了接口的定义及其实现方法,了解了JAVA的事件及处理机制,学会了事件监听者类的使用。现在,我能够写出一些简单的图形用户界面程序了。

  • 2
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大连民族大学 计算机科学与工程学院 《Java语言》课程实验报告 实验题目: 计算器的设计与实现 课程名称: Java语言 实验类型: 演示性 验证性 操作性 设计性 综合性 专业:网络工程 班级:**** 学生姓名*** 学号:***** 实验日期:2018年 4月23日 地点:计算机学院综合试验中心(I-303) 实验学时:4 实验成绩: 指导教师签字: 2018年 5月21日 1. 问题需求描述:Problem description 利用Java Swing设计计算器图形界面,并实现事件的监听,以及计算器基本的加、减、乘、除、 清空、输出运算结果的操作,学习使用各种图形界面的控件,容器,布局等,学习对 按钮事件的处理等。以及对非法输入的处理。 2. 设计说明:Design notes 本计算器界面方面总体采用BorderLayout布局,显示输入输入的文本框和清除按钮 采用FlowLayout布局,容器放在BorderLayout的North;0- 9和各种运算符号还有小数点采用GridLayout布局,容器放在BorderLayou的Center;事 件监听和处理通过实现addActioListener监视器接口和ItemEvent事件接口,从而对每一 个按钮实现事件的监听和处理;计算方面,调用ScriptEngineManager和ScriptEngine两 个类,直接通过eval函数直接把输入文本当作JS代码执行,输出执行结果,这样报错也 会直接实现,另把文本框设置不允许直接从键盘输入以防止出现安全事件。 最后通过转化成JS代码运算得到启发,使用类似方法,我还实现了调用VB代码实现计算 器实时读出键盘输入,发出声音。 3. 系统实现:system implementation 1.程序界面展示 4. 总结体会: summary and experience 实验达到了预期的目标。通过此次的编程,我学会了用Java语言编写简单的软件,增强 了我对学习Java的兴趣。编程过程中,总体设计主要是窗口与组件的应用,具体执行则 是利用Java语言设计算法,而难点也在算法的设计上。虽然程序大体上符合要求,但由 于第一次编写这么复杂的程序,程序仍然存在一- 些漏洞,譬如由于未进行异常处理,当连续输入运算符是程序会出错,还有若一直按小 数点的话会得到一连串的小数点。由于最近忙着考试没有时间修改,考试结束后一定认 真修改这些问题。我觉得在编程时应该注意排版对齐,这样不论是自己检查程序还是别 人阅读程序都会更加方便。如果能添加备注的话以后阅读程序会更容易些。在以后的编 程中我会吸取经验,养成认真、严谨的编程习惯。 附:程序清单 1. import javax.swing.JFrame; public class Calculator { public static void main(String[] paramArrayOfString) { CalculatorFrame localCalculatorFrame = new CalculatorFrame(); localCalculatorFrame.setSize(800, 800); localCalculatorFrame.setVisible(true); } } 2 import java.awt.Container; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; class CalculatorFrame extends JFrame { public CalculatorFrame() { setTitle("Calculator"); setSize(200, 200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent paramAnonymousWindowEvent) { System.exit(0); } }); Container localContainer = getContentPane(); localContainer.add(new CalculatorPanel()); } } 3. import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.awt.GridLayout; import java.awt.eve

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值