【Java Mooc图形练习】完整版计算器代码+复选框填空

题目链接
题目描述:‍编写Java GUI程序,实现一个简单计算器。要求如下:
‍(1)设计的界面如下图所示:窗体的标题栏显示“模拟计算器—江海大”,1个文本框用于显示输入字符和计算结果;20个按钮控件作为字符输入按键或者功能按键。
在这里插入图片描述
2)计算功能:实现加、减、乘、除等双目运算,开平方、百分数等单目运算;

简单版计算器(MOOC提交版)

前言:本题目为实现字符串四则运算,采用栈的知识来进行解答,以下是简单版计算器的代码:
在文本框中可以实现字符串运算,注意有几个小陷阱。第一是小数点后面可能存在0,例如7.03,如果单纯使用栈的话会把0给去掉,解决办法就是一开始运算的时候就得注意!
当然关于一些按钮的操作这里就不再赘述了。

/**
 * @author:Jacin Lee
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class TestGUI {
    public static void main(String[] args){
        MainFrame a=new MainFrame();
    }
}

class MainFrame extends JFrame implements ActionListener{
    JPanel contentPane = new JPanel();      //框架内容面板
    JPanel keyPane;//按键面板
    JTextField txtShow = new JTextField();  //显示文本框
    JButton []button=new JButton[20];
    String name[]={"C","/", "*", "←","7", "8", "9", "-", "4", "5", "6", "+", "1", "2", "3", "√", "%", "0", ".", "="};//按钮标签数组
    public MainFrame(){
        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout());
        setTitle("模拟计算器-江海大");
        keyPane = new JPanel(new GridLayout(5,4,5,5));   //按钮键面板设计
        txtShow.setText("");
        for(int i=0;i<20;i++){
            button[i]=new JButton(name[i]);
            keyPane.add(button[i]);
            button[i].addActionListener(this);
        }
        contentPane.add(txtShow,BorderLayout.NORTH);
        contentPane.add(keyPane,BorderLayout.CENTER);
        setLocationRelativeTo(null);
        setResizable(false);  //设置为不可调整大小
        setSize(400,400);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    public void actionPerformed(ActionEvent e){
        //按C键清空数据
        if(e.getSource()==button[0]){
            txtShow.setText("");
        }
        else if(e.getSource()==button[19]){
            String s=txtShow.getText();
            double m=calculate(s);
            txtShow.setText(""+Double.toString(m));
        }
        else if(e.getSource()==button[3]){
            String s=txtShow.getText();
            if(s.length()>1){
                s=s.substring(0, s.length()-1);
                txtShow.setText(s);
            }
        }
        else{
            txtShow.setText(txtShow.getText()+e.getActionCommand());
        }
    }
    public double calculate(String s){
        Stack<Double> stk=new Stack<Double>();
        double num=0;
        //首先将num前面的符号边长 “+”
        char sign='+';
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if(Character.isDigit(c)){
                num=num*10+(c-'0');
                String str="";
                str+=s.charAt(i)+".";
                if(i<s.length()-1){
                    if(s.charAt(i+1)=='.'){
                        for(int j=i+2;j<s.length();j++){
                            if(s.charAt(j)>=48&&s.charAt(j)<=57){
                                str+=s.charAt(j);
                            }else{
                                break;
                            }
                        }
                    }
                    num=Double.parseDouble(str);
                    if(s.charAt(i+1)=='%'){
                        num/=100;
                    }
                }
            }
            if(!Character.isDigit(c)||(i==s.length()-1)){
                double pre;
                switch(sign){
                    case '+':stk.push(num*1.0);break;
                    case '-':stk.push(-num*1.0);break;
                    case '*':pre=stk.pop();stk.push(pre*num*1.0);break;
                    case '/':pre=stk.pop();stk.push(pre*1.0/num);break;
                    case '√':stk.push(Math.sqrt(num));break;
                   // case '.':pre=stk.pop(); stk.push(pre+0.1*num);break;
                    default:break;
                }
                sign=c;
                num=0;
            }
        }
        double res=0;
        while(!stk.empty()){
            res+=stk.peek();
            stk.pop();
        }
        return res;
    }
}


复选框填空(MOOC)

‌程序填空题:完善程序,实现包括一个复选框的窗体。点选复选框,通过相应的事件处理后,能够在控制台显示复选框的选择信息。要求:在数字标示和注释符(//)的前面,填入合适代码;并且不要删除数字标示和注释符://(数字)。
直接附上代码:

import java.awt.*;
import java.awt.event.*;

import javax.swing.JFrame;
import javax.swing.JPanel;

/*---在(1)处进行类声明:类名为MyCheck,继承自Frame类---*/

 //(1)
public class MyCheck extends JFrame{
  public MyCheck(){
	 super("GUI程序设计实验");
	 /*---在(2)处创建面板对象,并设置其布局管理方式为FlowLayout---*/
     JPanel p=new JPanel(new FlowLayout());
     //(2)
     Checkbox cbx = new Checkbox("isPassed");
	/*---在(3)处完成两个功能:向面板中加入组件cbx,为组件cbx注册监听器。此处填写两行语句---*/
    p.add(cbx);
    cbx.addItemListener(new InnerFrame());
    //(3)
    add(p);

    /*---在(4)处设置窗体的属性:设置大小为(250,100),设置为可见。此处填写两行语句---*/
    setSize(250,100);
    setVisible(true);
     //(4)
    }

  public static void main(String[] args){
    new MyCheck();
  }
  
    /*---在(5)处声明内部类的类头:类名自定义---*/
    //(5)
    class InnerFrame implements ItemListener {
    public void itemStateChanged(ItemEvent e){
      System.out.println(e);
    }
    }
}


详细版计算器完整

既然是详细版那么就必须有一些详细设计。(全部代码请私信)

概要设计

MainFrame.java:实现主框架界面类
HandleNumber.java:数字按钮处理类
HandlePoint.java:小数点按钮处理类
HandleSign.java:正负号处理类
HandleEql.java:等号按钮处理类
HandleOP.java:运算按钮处理类
HandleBack.java:退格按钮处理类
HandleC.java:清空按钮处理类
HandleExit.java:退出按钮处理类。

部分关键代码:

MainFrame代码

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

public class MainFrame extends JFrame {

        JPanel contentPane = new JPanel();      //框架内容面板
        JTextField txtShow = new JTextField();  //显示文本框
        JPanel keyPane;                         //按钮键面板
        JButton btnNumber[] = new JButton[10];  //数字按钮
        //加,减,乘,除,等号,小数点,清0,正负号,退出,退格按钮
        JButton  btnAdd,btnSub,btnMul,btnDiv,btnEql,btnPoint,btnClear,btnSign,btnExit,btnBS;
        String[] operator = {"0","",""}; //用来保存操作数1、运算符、操作数2的数组,初始均为空
        static String lastClick = "";  //用户最近一次点击的按钮
        HandleNumber handleNum;   	//数字处理监听器
        HandleBack handleBack; 		//退格处理监听器
        HandlePoint handlePoint;	//小数点处理监听器
        HandleExit handleExit;		//退出处理监听器
        HandleC handleC;			//清除处理监听器
        HandleSign handleSign;		//正负号处理监听器
        HandleEql handleEql;		//等号处理监听器
        HandleOP handleOP;			//运算符处理监听器
        
        MainFrame(String s){
                super(s);
                setSize(350,250);
                setLocationRelativeTo(null);
                setResizable(false);  //设置为不可调整大小

                setContentPane(contentPane);
                contentPane.setLayout(new BorderLayout());

                //文本框的创建及设置
                txtShow.setFont(new Font("Times New Roman",Font.PLAIN,28));//字体设置
                txtShow.setBackground(Color.WHITE);  //白色背景
                txtShow.setForeground(Color.BLUE);   //蓝色文字
                txtShow.setHorizontalAlignment(JTextField.RIGHT);  //水平靠右
                txtShow.setEnabled(false);          //不可用
                txtShow.setText("0");                //初始内容为“0”

                handleNum = new HandleNumber(txtShow); //数字按钮处理
                for(int i=0;i<=9;i++){
                        btnNumber[i] = new JButton(""+i);
                        btnNumber[i].addActionListener(handleNum);
                }
                //各按钮的创建
                btnAdd = new JButton("+");
                btnSub = new JButton("-");
                btnMul = new JButton("*");
                btnDiv = new JButton("/");
                btnEql = new JButton("=");
                btnPoint = new JButton(".");
                btnClear = new JButton("C");
                btnSign = new JButton("+/-");
                btnExit = new JButton("关闭");
                btnBS = new JButton("退格");

                keyPane = new JPanel(new GridLayout(4,5,5,5));   //按钮键面板设计
                keyPane.add(btnNumber[7]);
                keyPane.add(btnNumber[8]);
                keyPane.add(btnNumber[9]);
                keyPane.add(btnDiv);
                keyPane.add(btnExit);
                keyPane.add(btnNumber[4]);
                keyPane.add(btnNumber[5]);
                keyPane.add(btnNumber[6]);
                keyPane.add(btnMul);
                keyPane.add(btnBS );
                keyPane.add(btnNumber[1]);
                keyPane.add(btnNumber[2]);
                keyPane.add(btnNumber[3]);
                keyPane.add(btnSub);
                keyPane.add(btnClear);
                keyPane.add(btnNumber[0]);
                keyPane.add(btnSign);
                keyPane.add(btnPoint);
                keyPane.add(btnAdd);
                keyPane.add(btnEql);

                handleBack = new HandleBack(txtShow); //退格按钮处理
                btnBS.addActionListener(handleBack);

                handlePoint = new HandlePoint(txtShow,operator);//小数点按钮处理
                btnPoint.addActionListener(handlePoint);

                handleExit = new HandleExit();//关闭按钮处理
                btnExit.addActionListener(handleExit);

                handleC = new HandleC(txtShow,operator);//清空按钮处理
                btnClear.addActionListener(handleC);

                handleSign = new HandleSign(txtShow);//正负号处理
                btnSign.addActionListener(handleSign);

                handleEql = new HandleEql(txtShow,operator);
                btnEql.addActionListener(handleEql);

                contentPane.add(txtShow,BorderLayout.NORTH);     //放置文本框
                contentPane.add(keyPane,BorderLayout.CENTER);    //放置按钮键面板

                handleOP = new HandleOP(txtShow,operator);
                btnAdd.addActionListener(handleOP);
                btnSub.addActionListener(handleOP);
                btnMul.addActionListener(handleOP);
                btnDiv.addActionListener(handleOP);

                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setVisible( true );
        }

        static boolean lastIsOperator(){
            String s = lastClick;
            if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/") || s.equals("="))
                return true;
            else
                return false;
        }

        public static void main(String args[]){
                new MainFrame("计算器");
        }
}

HandleNumber.java:

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

public class HandleNumber implements ActionListener {
        JTextField txtShow;
        HandleNumber(JTextField txt){
                txtShow = txt;
        }

        public void actionPerformed(ActionEvent e) {
                String num = e.getActionCommand();
                String s = txtShow.getText();
                if(MainFrame.lastIsOperator()){  //若刚刚点击过运算符
                	txtShow.setText(num);        //文本框中重新显示点击数字
                }
                else{                            //否则,即正在输入数字或清空、退格
                	if(s.equals("0")){           //若文本框中是0
                        txtShow.setText(num);    //则用点击数字覆盖文本框内容
                    }
                    else
                        txtShow.setText(s+num);  //否则在文本框内容后面附加点击数字
                }

                MainFrame.lastClick = e.getActionCommand();  //记录本次点击按钮
                
        }

}

HandleOP.java

import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class HandleOP implements ActionListener {
    JTextField txtShow;
    String operator[];
    public HandleOP(JTextField txt,String[] op) {
        txtShow = txt;
        operator = op;
    }

    public void actionPerformed(ActionEvent e) {
    	//若运算符为空(即首次输入运算符),或刚刚点击过运算符
        if(operator[1].equals("")||MainFrame.lastIsOperator()){  
            operator[0] = txtShow.getText();       //则提取文本框内容为操作数1
            operator[1] = e.getActionCommand();    //记录本次点击运算符
        }
        else{  //进行计算
        	operator[2] = txtShow.getText();  //提取文本框内容为操作数2
            String res = calculate();         //进行计算
            txtShow.setText(res);        //在文本框中显示结果
            operator[0] = res;             //将结果更新为操作数1
            operator[1] = e.getActionCommand();    //记录运算符
        }
        
        MainFrame.lastClick = e.getActionCommand(); //记录刚刚点击的内容
        
    }


    String calculate(){
        double x1,x2;
        String result=null;
        char op = operator[1].charAt(0);
        x1 = Double.parseDouble(operator[0]);
        x2 = Double.parseDouble(operator[2]);
        switch(op){
        case '+':
            result = x1 + x2 + "";break;
        case '-':
            result = x1 - x2 + "";break;
        case '*':
            result = x1 * x2 + "";break;
        case '/':
        	if(x2!=0)
        		result = x1/x2 + "";
        	else
        		result = "除数不能为零";
        }
        return result;
    }
}

其余代码不再给出,如有需要请私信联系!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值