4 设计计算器clac-Java

该文展示了如何使用JavaSwing库创建一个简单的图形用户界面计算器,包括加、减、乘、除等基本运算,以及百分比、倒数等特殊功能。代码实现了按钮点击事件处理,但存在一些限制,如运算符只能使用一次,显示仅限当前输入,以及精度问题等。
摘要由CSDN通过智能技术生成

题目: 

设计并实现一个类似于windows操作系统附件中自带的计算器的一款简单的计算器,要求界面美观,设计合理;带有常用的菜单并实现其功能;能完成加、减、乘、除等简单的计算,在下面写出其核心代码。 

解答:

package Experiment_4;

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class Clac {

    static double num1 = 0, num2 = 0;	//定义num1为历史数据,num2为当前数据
    static char ch = '+';	//定义ch为当前运算符
    static String s = "";	//定义s为展示的数据
    static boolean flag = false; //定义flag标志是否刚做完求值运算

    public static void main(String[] args) {

        JFrame.setDefaultLookAndFeelDecorated(true);	//设置JFram外观风格
        JFrame frame = new JFrame("clac");	//创建一个JFrame类顶级容器
        frame.setSize(400, 600);
        frame.setLayout(new GridLayout(2,1));
        //获得顶级容器的内容面板contentPane,只有通过它才能加入其他组件
        //它属于中间容器JRootPane的一部分
        Container contentPane = frame.getContentPane();

        JPanel panel1 = new JPanel();
        panel1.setSize(400, 120);
        panel1.setLayout(new GridLayout(1,1));	//设置布局
        final JLabel label = new JLabel("0",SwingConstants.CENTER);	//创建原子组件Label
        label.setSize(400, 120);
        //将原子组件添加到中间容器上
        panel1.add(label);
        panel1.setBorder(BorderFactory.createLineBorder(Color.black, 2));
        contentPane.add(panel1, BorderLayout.PAGE_START);
        //frame.add(panel1, BorderLayout.PAGE_START);

        JPanel panel2 = new JPanel();	//创建一个JPanel类的中间容器panel
        panel2.setBorder(BorderFactory.createLineBorder(Color.black, 3));	//设置边框
        panel2.setLayout(new GridLayout(6, 4));	//设置布局
        panel2.setSize(400, 480);

        //对历史结果进行百分号运算
        JButton button1 = new JButton("%");
        button1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num1 *= 0.01; label.setText(Double.toString(num1));}});
        panel2.add(button1);

        //清除当前数据
        JButton button2 = new JButton("CE");
        button2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s = ""; num2 = 0; label.setText("0");}});
        panel2.add(button2);

        //清除当前数据和历史数据
        JButton button3 = new JButton("C");
        button3.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s = ""; num1 = 0; num2 = 0; ch = '+'; label.setText("0");}});
        panel2.add(button3);

        //清除当前数据的末位数字
        JButton button4 = new JButton("<x");
        button4.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s = s.substring(0, s.length() - 1); label.setText(s);}});
        panel2.add(button4);

        //对历史数据进行求倒数运算
        JButton button5 = new JButton("1/x");
        button5.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num1 = 1/num1; label.setText(Double.toString(num1));}});
        panel2.add(button5);

        //对历史数据进行求平方运算
        JButton button6 = new JButton("x^2");
        button6.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num1 *= num1; label.setText(Double.toString(num1));}});
        panel2.add(button6);

        //对历史数据进行求平方运算
        JButton button7 = new JButton("2√x");
        button7.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num1 = Math.sqrt(num1); label.setText(Double.toString(num1));}});
        panel2.add(button7);

        //将历史数据与当前数据进行除运算
        JButton button8 = new JButton("/");
        button8.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num2 = toNum(s); num1 = operation(num1, num2, ch); ch = '/'; s = ""; label.setText("/");}});
        panel2.add(button8);

        //输入数字7
        JButton button9 = new JButton("7");
        button9.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "7"; label.setText(s);}});
        panel2.add(button9);

        //输入数字8
        JButton button10 = new JButton("8");
        button10.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "8"; label.setText(s);}});
        panel2.add(button10);

        //输入数字9
        JButton button11 = new JButton("9");
        button11.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "9"; label.setText(s);}});
        panel2.add(button11);

        //将历史数据与当前数据进行乘运算
        JButton button12 = new JButton("*");
        button12.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num2 = toNum(s); num1 = operation(num1, num2, ch); ch = '*'; s = ""; label.setText("*");}});
        panel2.add(button12);

        //输入数字4
        JButton button13 = new JButton("4");
        button13.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "4"; label.setText(s);}});
        panel2.add(button13);

        //输入数字5
        JButton button14 = new JButton("5");
        button14.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "5"; label.setText(s);}});
        panel2.add(button14);

        //输入数字6
        JButton button15 = new JButton("6");
        button15.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "6"; label.setText(s);}});
        panel2.add(button15);

        //将历史数据与当前数据进行减运算
        JButton button16 = new JButton("-");
        button16.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num2 = toNum(s); num1 = operation(num1, num2, ch); ch = '-'; s = ""; label.setText("-");}});
        panel2.add(button16);

        //输入数字1
        JButton button17 = new JButton("1");
        button17.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "1"; label.setText(s);}});
        panel2.add(button17);

        //输入数字2
        JButton button18 = new JButton("2");
        button18.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "2"; label.setText(s);}});
        panel2.add(button18);

        //输入数字3
        JButton button19 = new JButton("3");
        button19.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "3"; label.setText(s);}});
        panel2.add(button19);

        //将历史数据与当前数据进行加运算
        JButton button20 = new JButton("+");
        button20.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num2 = toNum(s); num1 = operation(num1, num2, ch); ch = '+'; s = ""; label.setText("+");}});
        panel2.add(button20);

        //对当前数据进行求相反数操作
        JButton button21 = new JButton("+/-");
        button21.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {if(s == "") s = "-"; else if(s == "-") s = ""; else {num2 = toNum(s); num2 = -num2; s = Double.toString(num2);} label.setText(s);}});
        panel2.add(button21);

        //输入数字0
        JButton button22 = new JButton("0");
        button22.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "0"; label.setText(s);}});
        panel2.add(button22);

        //输入小数点
        JButton button23 = new JButton(".");
        button23.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {if(s == "") s += "0"; s += "."; label.setText(s);}});
        panel2.add(button23);

        //求运算结果
        JButton button24 = new JButton("=");
        button24.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num2 = toNum(s); num1 = operation(num1, num2, ch); s = ""; flag = true; label.setText(Double.toString(num1));}});
        panel2.add(button24);

        contentPane.add(panel2);	//将中间容器通过内容面板添加到顶层容器上
        //frame.pack();	//对组件进行排列
        frame.setVisible(true);	//显示
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	//关闭此GUI则关闭程序
    }

    //将当前输入框中的String数据s转化为double型的数据num
    public static double toNum(String s) {
        double num1 = 0;
        int i = 0;
        boolean flag = true;
        if(s == "") s += '0';	//若s为空则将其置零
        if(s.charAt(0) == '-') 	//若首位为符号则做标记,并将下标后移
        {
            flag = false;
            i++;
        }
        for(; i < s.length() && s.charAt(i) != '.'; i++)	//转化整数部分
        {
            num1 = num1 * 10 + (s.charAt(i) - '0');
        }
        if(i == s.length())	//若无小数部分则直接返回
        {
            if(flag) return num1;
            else return -num1;
        }
        double num2 = 0;	//转化小数部分
        for(int j = s.length() - 1; j > i; j--)
        {
            num2 = (num2 + (s.charAt(j) - '0')) / 10;
        }
        double num = num1 + num2;	//将整数部分与小数部分相加
        if(flag) return num;
        else return -num;
    }

    //运算方法,用于计算加减乘除
    public static double operation(double num1, double num2, char ch) {
        double num = 0;
        switch(ch) {
            case '+':
                if(flag) {num = num1 + 0; flag = false;}
                num = num1 + num2;
                break;
            case '-':
                if(flag) {num = num1 - 0; flag = false;}
                num = num1 - num2;
                break;
            case '*':
                if(flag) {num = num1 * 1; flag = false;}
                else num = num1 * num2;
                break;
            case '/':
                if(flag) {num = num1 / 1; flag = false;}
                else num = num1 / num2;
                break;
        }
        return num;
    }
}

/*
	待改进:
	1. 加减乘除运算键只能按一次,如果刚按完'+'发现按错了,想修改为'-',不能直接再点一次'-',只能让它先+0,保持它的值不变,再进行减运算
	2. 部分运算都带有限制,如'%','1/x'等运算,只能针对历史记录进行运算,'+/-'运算只能针对当前数据等
	3. 使用JLabel只能显示当前输入的一行数据,不能像电脑计算器一样显示所有的历史运算记录
	4. 界面不够美观
	5. 由于计算涉及到小数运算,所以必须使用double类型,这也注定了其存在一定的精度亏损问题,可能会出现一个数先开根再平方,前后两个数字理论上相同,但实际有一定误差的情况
    6. 将顶层容器frame分成两部分似乎是平均分的,尚不清楚在哪里修改使它变成上半部分高为120px,下半部分高为480px
*/

成果展示:

 

 待改进:

1. 加减乘除运算键只能按一次,如果刚按完'+'发现按错了,想修改为'-',不能直接再点一次'-',只能让它先+0,保持它的值不变,再进行减运算
2. 部分运算都带有限制,如'%','1/x'等运算,只能针对历史记录进行运算,'+/-'运算只能针对当前数据等
3. 使用JLabel只能显示当前输入的一行数据,不能像电脑计算器一样显示所有的历史运算记录
4. 界面不够美观
5. 由于计算涉及到小数运算,所以必须使用double类型,这也注定了其存在一定的精度亏损问题,可能会出现一个数先开根再平方,前后两个数字理论上相同,但实际有一定误差的情况
6. 将顶层容器frame分成两部分似乎是平均分的,尚不清楚在哪里修改使它变成上半部分高为120px,下半部分高为480px

欢迎大家探讨 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值