java课程设计-计算器(上)

这个博客展示了用Java实现的计算器课程设计,包括主函数类CalculatorFram、历史记录面板LogPanel、显示区面板TextPanel和计算按钮面板CalculatePanel。计算器支持基本运算、历史记录查看、以及二进制、八进制和十六进制转换。核心算法在另一个未展示的部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java课程设计-计算器

运行截图
在这里插入图片描述
所包含的类:
在这里插入图片描述
CalculatorFram包主函数的类,整合各个面板

package Calculator;

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

public class CalculatorFram extends JFrame {

    public CalculatorFram()  {

        super("计算器");
        Toolkit kit = Toolkit.getDefaultToolkit();//绑定本地系统,用于查询本机的一些信息
        Dimension screenSize = kit.getScreenSize();//获取屏幕分辨率,Dimension实例有wight和height属性,用来存组件的大小
        setSize(screenSize.width/9*5,screenSize.height/5*3);//大小
        setLocation(screenSize.width/4,screenSize.height/4);//位置

        this.setBackground(new Color(248,248,248));
        setLayout(new BorderLayout());


        ImageIcon imageIcon=new ImageIcon(".\\tubiao.png");
        this.setIconImage(imageIcon.getImage());


        LogPanel logPanel = new LogPanel();
        add(logPanel,BorderLayout.EAST);//新建log面板添加到主窗口

        JPanel panel= new JPanel();
        panel.setLayout(new BorderLayout());//新建panel面板


        TextPanel textPanel = new TextPanel();
        panel.add(textPanel, BorderLayout.NORTH);//新建结果显示窗口并添加到panel

        CalculatePanel calculatePanel=new CalculatePanel(textPanel, logPanel);
        panel.add(calculatePanel,BorderLayout.CENTER);//新建按钮面板并添加到panel面板

        add(panel,BorderLayout.CENTER);

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

    public static void main(String[] args) {
        CalculatorFram c = new CalculatorFram();

    }
}

LogPanel存放历史记录面板

package Calculator;

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

public class LogPanel extends JPanel {
    JTextArea log;
    StringBuffer logMessage = new StringBuffer("历史记录:\n\n");
    GridBagLayout gridBag = new GridBagLayout();
    GridBagConstraints gc = new GridBagConstraints();
    JLabel label ;

    public LogPanel() {

        setLayout(gridBag);
        gc.fill = GridBagConstraints.BOTH;
        gc.weightx = 1.0;
        gc.weighty = 1.0;

        log = new JTextArea( 2, 23);
        log.setBackground(new Color(243,243,243));
        log.setBorder(null);
        log.setText(logMessage.toString());
        log.setSelectedTextColor(Color.RED);
        log.setFont(new Font("黑体",Font.BOLD,15));

        log.setEditable(false);
        log.setLineWrap(true);        //激活自动换行功能
        log.setWrapStyleWord(true);   //设置在单词过长的时候是否要把长单词移到下一行。
        JScrollPane scroll = new JScrollPane(log);

        scroll.setHorizontalScrollBarPolicy(
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scroll.setVerticalScrollBarPolicy(
                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);//设置滚动条自动出现

        scroll.setBackground(Color.BLUE);

        scroll.setBorder(null);   //添加滚动条的jtextarea设置无边框
        scroll.setOpaque(true); //设置背景透明

        gc.gridx=0;gc.gridy=1;
        add(scroll,gc);
        TextPanel text= new TextPanel();

    }
}

TextPanel显示区面板

package Calculator;

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

public class TextPanel extends JPanel {

    JLabel hint = new JLabel(" ");
    JLabel input = new JLabel(" ");
    JLabel answer= new JLabel("0");
    
    public TextPanel() {
        setLayout(new BorderLayout());

        this.setBackground(new Color(244,244,244));
        answer.setHorizontalAlignment(JLabel.RIGHT);
        hint.setHorizontalAlignment(JLabel.RIGHT);
        input.setHorizontalAlignment(JLabel.RIGHT);//设置右对齐
        
        answer.setFont(new Font("黑体",Font.BOLD, 35));
        input.setFont(new Font("黑体",Font.PLAIN, 25));
        hint.setFont(new Font("宋体",Font.BOLD, 25));

        add(hint,BorderLayout.NORTH);
        add(input,BorderLayout.CENTER);
        add(answer,BorderLayout.SOUTH);
    }
}

CalculatePanel包含按钮的外观和功能

package Calculator;

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

public class CalculatePanel extends JPanel {
    JButton b1,b2,b3,b4,b5,b6,b7,b8,b9,b0;//数字按钮
    JButton bAdd,  bMinus, bMultiply, bDivide, bEqual;//加减乘除按钮
    JButton CE, C, sqrt, pow, delete, reciprocal, point, left, right, B2, O8, H16;
    TextPanel textPanel;
    LogPanel logPanel;
    StringBuffer expressions = new StringBuffer();//存储计算式的字符串

    GridBagConstraints gc= new GridBagConstraints();
    GridBagLayout gridBag = new GridBagLayout();

    CommandAction command = new CommandAction();
    OperationListener operation = new OperationListener();

    public CalculatePanel(TextPanel tx, LogPanel log) {

        this.textPanel = tx;//同步主窗口中的TextPanel面板
        this.logPanel = log;//同步主窗口中的LogPanel面板

        this.setBackground(new Color(247,247,247));
        setLayout(gridBag);

        gc.fill = GridBagConstraints.BOTH;
        gc.weightx = 1.0;
        gc.weighty = 1.0;

        Color white = new Color(252,252,252);
        Color gray = new Color(247,247,247);
        gc.gridx=1;gc.gridy=6;
        b0 = makeJButton("0",gc, command,white);
        gc.gridx=0;gc.gridy=5;
        b1 = makeJButton("1",gc, command,white);
        gc.gridx=1;gc.gridy=5;
        b2 = makeJButton("2",gc, command,white);
        gc.gridx=2;gc.gridy=5;
        b3 = makeJButton("3",gc, command,white);
        gc.gridx=0;gc.gridy=4;
        b4 = makeJButton("4",gc, command,white);
        gc.gridx=1;gc.gridy=4;
        b5 = makeJButton("5",gc,command,white);
        gc.gridx=2;gc.gridy=4;
        b6 = makeJButton("6",gc,command,white);
        gc.gridx=0;gc.gridy=3;
        b7 = makeJButton("7",gc,command,white);
        gc.gridx=1;gc.gridy=3;
        b8 = makeJButton("8",gc,command,white);
        gc.gridx=2;gc.gridy=3;
        b9 = makeJButton("9",gc,command,white);
        gc.gridx=0;gc.gridy=6;
        point = makeJButton(".",gc,command,white);



        gc.gridx=2;gc.gridy=6;
        bEqual = makeJButton("=",gc,operation,new Color(145,193,231));

        gc.gridx=3;gc.gridy=3;
        bDivide = makeJButton("/",gc,operation,gray);
        gc.gridx=3;gc.gridy=4;
        bMultiply = makeJButton("*",gc,operation,gray);
        gc.gridx=3;gc.gridy=5;
        bMinus = makeJButton("-",gc,operation,gray);
        gc.gridx=3;gc.gridy=6;
        bAdd = makeJButton("+",gc,operation,gray);


        gc.gridx=1;gc.gridy=1;
        CE = makeJButton("CE",gc,command,gray);
        gc.gridx=2;gc.gridy=1;
        C = makeJButton("C",gc,command,gray);
        gc.gridx=3;gc.gridy=1;
        delete = makeJButton("Delete",gc,command,gray);
        gc.gridx=0;gc.gridy=1;
        reciprocal = makeJButton("1/x",gc,command,gray);
        gc.gridx=0;gc.gridy=2;
        pow = makeJButton("x^2",gc,operation,gray);
        gc.gridx=1;gc.gridy=2;
        sqrt = makeJButton("√x",gc,operation,gray);
        gc.gridx=2;gc.gridy=2;
        left = makeJButton("(",gc,command,gray);
        gc.gridx=3;gc.gridy=2;
        right= makeJButton(")",gc,command,gray);

        gc.gridx=0;gc.gridy=0;
        B2= makeJButton("二进制",gc,operation,gray);
        gc.gridx=1;gc.gridy=0;
        O8= makeJButton("八进制",gc,operation,gray);
        gc.gridx=2;gc.gridy=0;
        H16= makeJButton("十六进制",gc,operation,gray);


    }

    JButton makeJButton(String name, GridBagConstraints gc, ActionListener listener, Color color){
        //通过约束gc,创建按钮
        JButton b=new JButton(name);
        b.setFont(new Font("黑体",Font.BOLD,15));
        b.setBackground(color);
        gridBag.setConstraints(b, gc);
        b.addActionListener(listener);
        b.setBorderPainted(false);
        add(b);
        return b;
    }

    class CommandAction implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            String str=actionEvent.getActionCommand();
            if(str=="0"){
                expressions.append("0");
                textPanel.input.setText(expressions.toString());

            }
            if(str=="1"){
                expressions.append("1");
                textPanel.input.setText(expressions.toString());

            }
            if(str=="2"){
                expressions.append("2");
                textPanel.input.setText(expressions.toString());
            }
            if(str=="3"){
                expressions.append("3");
                textPanel.input.setText(expressions.toString());
            }
            if(str=="4"){
                expressions.append("4");
                textPanel.input.setText(expressions.toString());
            }
            if(str=="5"){
                expressions.append("5");
                textPanel.input.setText(expressions.toString());
            }
            if(str=="6"){
                expressions.append("6");
                textPanel.input.setText(expressions.toString());
            }
            if(str=="7"){
                expressions.append("7");
                textPanel.input.setText(expressions.toString());
            }
            if(str=="8"){
                expressions.append("8");
                textPanel.input.setText(expressions.toString());
            }
            if(str=="9"){
                expressions.append("9");
                textPanel.input.setText(expressions.toString());
            }
            if(str=="("){
                expressions.append("(");
                textPanel.input.setText(expressions.toString());
            }
            if(str==")"){
                expressions.append(")");
                textPanel.input.setText(expressions.toString());
            }

            if(str=="."){
                expressions.append(".");
                textPanel.input.setText(expressions.toString());
            }
            if(str=="Delete"){
                if(expressions.length()>0){
                    expressions.deleteCharAt(expressions.length()-1);
                    textPanel.input.setText(expressions.toString());
                }
            }
            if(str=="1/x"){
                expressions.insert(0,"1/(").toString();
                expressions.append(")").toString();
                textPanel.input.setText(expressions.toString());
            }
            if(str=="C"){//清空所有
                textPanel.hint.setText(" ");
                textPanel.answer.setText("0");
                textPanel.input.setText(" ");
                logPanel.logMessage = new StringBuffer("历史记录:\n\n");
                expressions = new StringBuffer();
                logPanel.log.setText(logPanel.logMessage.toString());

            }
            if(str=="CE"){
                expressions = new StringBuffer();
                textPanel.hint.setText(" ");
                textPanel.answer.setText("0");
                textPanel.input.setText(" ");
            }
            textPanel.hint.setText(" ");

        }
    }
    class OperationListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            String str=actionEvent.getActionCommand();
            if(str=="="){
                try {
                    String answer = String.valueOf(new MathTool().calculate(expressions.toString()));
                    textPanel.input.setText(expressions.append("=").toString());
                    textPanel.answer.setText(answer);
                    logPanel.logMessage.append(expressions+"\n"+answer+"\n\n");//同步历史记录
                    logPanel.log.setText(logPanel.logMessage.toString());

                } catch (FormulaException e) {
                    textPanel.hint.setText(e.getMessage());
                    textPanel.answer.setText(" ");
                }
                expressions = new StringBuffer();//将expressions清空

            }
            if(str=="√x"){
                try{
                    double a = Math.sqrt(new MathTool().calculate(expressions.toString()));
                    String answer = String.valueOf(a);
                    textPanel.input.setText(expressions.insert(0,"√(").toString());
                    textPanel.input.setText(expressions.append(")=").toString());
                    textPanel.answer.setText(answer);
                    logPanel.logMessage.append(expressions+"\n"+answer+"\n\n");//同步历史记录
                    logPanel.log.setText(logPanel.logMessage.toString());
                } catch (FormulaException e) {
                    textPanel.hint.setText(e.getMessage());
                    textPanel.answer.setText(" ");
                }
            }
            if(str=="x^2"){
                try{
                    double a = Math.pow(new MathTool().calculate(expressions.toString()),2);
                    String answer = String.valueOf(a);
                    textPanel.input.setText(expressions.insert(0,"(").toString());
                    textPanel.input.setText(expressions.append(")^2=").toString());
                    textPanel.answer.setText(answer);
                    logPanel.logMessage.append(expressions+"\n"+answer+"\n\n");//同步历史记录
                    logPanel.log.setText(logPanel.logMessage.toString());
                } catch (FormulaException e) {
                    textPanel.hint.setText(e.getMessage());
                    textPanel.answer.setText(" ");
                }
            }
            if(str=="+"){
                try{
                    String answer = String.valueOf(new MathTool().calculate(expressions.toString()));
                    textPanel.answer.setText(answer);
                }catch (FormulaException e) {
                    textPanel.hint.setText(e.getMessage());
                    textPanel.answer.setText(" ");
                }
                expressions.append("+");
                textPanel.input.setText(expressions.toString());
            }
            if(str=="-"){
                try{
                    String answer = String.valueOf(new MathTool().calculate(expressions.toString()));
                    textPanel.answer.setText(answer);
                }catch (FormulaException e) {
                    textPanel.hint.setText(e.getMessage());
                    textPanel.answer.setText(" ");
                }
                expressions.append("-");
                textPanel.input.setText(expressions.toString());
            }
            if(str=="*"){
                try{
                    String answer = String.valueOf(new MathTool().calculate(expressions.toString()));
                    textPanel.answer.setText(answer);
                }catch (FormulaException e) {
                    textPanel.hint.setText(e.getMessage());
                    textPanel.answer.setText(" ");
                }
                expressions.append("*");
                textPanel.input.setText(expressions.toString());
            }
            if(str=="/"){
                try{
                    String answer = String.valueOf(new MathTool().calculate(expressions.toString()));
                    textPanel.answer.setText(answer);
                }catch (FormulaException e) {
                    textPanel.hint.setText(e.getMessage());
                    textPanel.answer.setText(" ");
                }
                expressions.append("/");
                textPanel.input.setText(expressions.toString());
            }
            if(str=="二进制"){
                String answer=textPanel.input.getText();
                boolean flag= true;
                try{
                    int i = Integer.parseInt(textPanel.input.getText());
                    answer=Integer.toBinaryString(i);
                }catch (Exception e){
                    flag = false;
                }
                if(flag){
                    logPanel.logMessage.append(expressions+"=\n"+answer+"\n\n");//同步历史记录
                    logPanel.log.setText(logPanel.logMessage.toString());
                    textPanel.answer.setText(answer);
                }
                else{
                    textPanel.hint.setText("目前只支持转换整数!");
                    textPanel.answer.setText("0");
                }


            }
            if(str=="八进制"){
                String answer=textPanel.input.getText();
                boolean flag= true;
                try{
                    int i = Integer.parseInt(textPanel.input.getText());
                    answer="o"+Integer.toOctalString(i);
                }catch (Exception e){
                    flag = false;
                }
                if(flag){
                    logPanel.logMessage.append(expressions+"=\n"+answer+"\n\n");//同步历史记录
                    logPanel.log.setText(logPanel.logMessage.toString());
                    textPanel.answer.setText(answer);
                }
                else{
                    textPanel.hint.setText("目前只支持转换整数!");
                    textPanel.answer.setText("0");
                }
            }
            if(str=="十六进制"){
                String answer=textPanel.input.getText();
                boolean flag= true;
                try{
                    int i = Integer.parseInt(textPanel.input.getText());
                    answer="ox"+Integer.toHexString(i);
                }catch (Exception e){
                    flag = false;
                }
                if(flag){
                    logPanel.logMessage.append(expressions+"=\n"+answer+"\n\n");//同步历史记录
                    logPanel.log.setText(logPanel.logMessage.toString());
                    textPanel.answer.setText(answer);
                }
                else{
                    textPanel.hint.setText("目前只支持转换整数!");
                    textPanel.answer.setText("0");
                }
            }

        }
    }
}

核心的算法实现是抄的,就放在下一篇吧!

java课程设计-计算器(下)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值