目录

主要用到的就是布局和点击事件,菜单没写功能,能实现简单的四则运算,用非常简单的方法写的,代码放出供新手一起学习,我也是新手。

截图献丑:

JAVA - 简单计算器

package com.software.GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
/*
 * 目前存在的问题:
 * 1.运算得出结果后,再次直接输入数值,文本框数值不会清零。
 * 2.运算符+-x/点击一个后再点击第二个还是会输出第一次点击的运算符其结果。
 * 3.能输入多个小数点问题。(已解决)
 * */
public class Calculator{
    private JFrame frame;
    private JPanel panel;
    private JPanel panelCenter;
    private JButton btn[];
    private JTextField txt;//显示框

    private JMenuBar menuBar;
    private JMenu menuLook,menuEdit,menuHelp;
    private JMenuItem miStandard,miScientific,miProgrammer,mecopy,mecut,mehistory,mhabout;

    private double num1, num2, result; // 定义三个double类型的变量
    private char c; // 定义字符型变量c,来保存操作符号
    private JButton cc;//清除按钮

    public Calculator() {
        /*菜单*/
        menuBar = new JMenuBar();
        menuLook = new JMenu("查看(V)");
        miStandard = new JMenuItem("标准型");
        miScientific = new JMenuItem("科学型");
        miProgrammer = new JMenuItem("程序员型");
        menuEdit = new JMenu("编辑(E)");
        mecopy = new JMenuItem("复制");
        mecut = new JMenuItem("粘贴");
        mehistory = new JMenuItem("历史记录");
        menuHelp = new JMenu("帮助(H)");
        mhabout = new JMenuItem("关于");
        //菜单项添加到菜单里
        menuLook.add(miStandard);
        //menuLook.addSeparator();//分割线
        menuLook.add(miScientific);
        //menuLook.addSeparator();
        menuLook.add(miProgrammer);
        //快捷键
        menuLook.setMnemonic(KeyEvent.VK_V);

        menuEdit.setMnemonic(KeyEvent.VK_E);
        menuEdit.add(mecopy);
        menuLook.addSeparator();
        menuEdit.add(mecut);
        menuLook.addSeparator();
        menuEdit.add(mehistory);

        menuHelp.setMnemonic(KeyEvent.VK_H);
        menuHelp.add(mhabout);

        //组合键
        miStandard.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
        mecopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
        mecut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
        mehistory.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_MASK));
        //菜单添加到菜单栏里
        menuBar.add(menuLook);
        menuBar.add(menuEdit);
        menuBar.add(menuHelp);

        /*计算器开始*/
        frame = new JFrame("计算器");
        panel = new JPanel();
        panelCenter = new JPanel();

        //显示框
        txt = new JTextField(19);//长度
        cc = new JButton("clear");

        btn = new JButton[16];
        String str = "123+456-789*0.=/"; // 创建字符串 也就是每个按钮的文本
        for (int i = 0; i < str.length(); i++) { // 对字符串进行遍历 截取字符
            btn[i] = new JButton(str.charAt(i) + ""); // 根据字符创建按钮 并将按钮放入jbs集合
        }
        btnLayout(); // 调用布局方法
        addEventHandler();// 调用addEventHandler方法
        show();// 调用showMe方法
    }

    /*按钮布局*/
    private void btnLayout() {
        panelCenter.setLayout(new GridLayout(4, 4,10,10)); // 设定该面板为4行4列布局
        for (int i = 0; i < 16; i++) { // 循环16个按钮
            panelCenter.add(btn[i]); // 将按钮一个个取出来放到panelCenter里面
        }
    }

    /*点击事件*/
    private void addEventHandler() {
        ActionListener listener = new ActionListener() {
            // 点击触发事件
            public void actionPerformed(ActionEvent e) {
                JButton jb = (JButton) e.getSource();// 获取到事件源 也就是被点击的哪个按钮
                String str = jb.getText().trim();// 把字符串的首尾空格去掉!
                if ("0123456789".indexOf(str) != -1) {// 如果是数字
                    txt.setText(txt.getText() + str); // 将文本框的内容加上当前的输入的数字
                    return;
                }
                // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面  
                if ((str.equals(".")) && (txt.getText().indexOf(".") < 0)){
                    txt.setText(txt.getText() + str); // 
                    return;
                }
                if ("+-*/".indexOf(str) != -1) {// 如果是加减乘除
                    num1 = Double.parseDouble(txt.getText());// 先获取文本框的值
                                                                // 并保存到num1
                    txt.setText(""); // 然后将文本框清空
                    c = str.charAt(0); // 获取操作符号 并保存到c
                    txt.setText("");// 这里重复操作 垃圾代码
                    return;
                }
                if (str.equals("=")) {// 如果输入的等于操作
                    num2 = Double.parseDouble(txt.getText()); // 获取文本框的值 保存到num2

                    switch (c) {// 判断之前输入的符号
                    case '+':
                        result = num1 + num2;
                        break;// 这里的四个就是做加减乘除操作 要点就是讲之前保存的num1 和 num2获取出来 进行操作
                                // 将结果保存 result
                    case '-':
                        result = num1 - num2;
                        break;
                    case '*':
                        result = num1 * num2;
                        break;
                    case '/':
                        result = num1 / num2;
                        break;
                    }
                    txt.setText(Double.toString(result));// 把result的值 付给当前文本框

                    return;

                }

                if (e.getActionCommand().equals("clear")) {// 如果按时 清除按钮

                    txt.setText(""); // 情况文本框内容 不过这里也有bug 个人认为应该把num1 和 num2也清0
                    return;
                }
            }
        };
        // 对txt集合进行遍历
        for (int i = 0; i < btn.length; i++) {
            // 给按钮添加事件
            btn[i].addActionListener(listener);
        }
        // 对清除按钮添加事件
        cc.addActionListener(listener); 

    }

    private void show() {
        frame.pack();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setJMenuBar(menuBar);//菜单项
        panel.add(txt,BorderLayout.NORTH);//显示框
        panel.add(panelCenter,BorderLayout.CENTER);//16按钮
        panel.add(cc,BorderLayout.SOUTH);//清除按钮

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);//窗口缩放
        frame.setLocationRelativeTo(null);
        frame.setContentPane(panel);

        frame.setVisible(false);
        frame.setVisible(true); // 设置可见
        frame.setSize(250, 270);
        frame.setIconImage(frame.getToolkit().getImage("d:\\Calculator.png"));
    }

    public static void main(String[] args) {
        new Calculator();

    }
}