Java實訓作業二(簡易計算器的設計)

本次實訓作業爲,設計一個簡易的計算器

目錄

一、作業要求:

二、主要功能需求分析

三、參考代碼


一、作業要求:

1、設計一個簡易計算器的GUI窗口,窗口標題上必須含有學生姓名信息。窗口外觀、按鈕顏色、佈局風格隨意,但要求簡潔、美觀。

2、每個班級刻錄一張光盤,光盤封面寫上班級信息、課程信息、指導老師姓名,如:2018計算機1班《Java實訓作業》,指導老師:謝祥選。

3、在光盤上建立一個【班級】目錄,在班級目錄下再以【學號_姓名】方式創建學生目錄,班級和學生目錄請使用漢字中括符(【】)括起來,學生目錄中的學號與姓名之間的連接符爲英文的下劃線(_),不是減號(-)。

4、把要上交的作品的項目根目錄或項目工作空間目錄完整的複製到學生自已的文件夾中,上交的作業中的項目目錄不能用中括符(【】)括起來,必須保留開發時的原始目錄結構與名稱。

上交的作品光盤目錄結構如下:

光盤F:\

  |----【18計算機1班】

             |----【20180324_張三丰】

                          |----LoginFrame

                                   |----.idea

                                   |----out

                                   |----src

                          |----MyNotepad

                                   |----.idea

                                   |----out

                                   |----src

             |----20180325_李四光

                          |----MyCalculator

                                   |----.idea

                                   |----out

                                   |----src

                          |----MyNotepad

                                   |----.idea

                                   |----out

                                   |----src

             |----20180368_小宇飛刀

                          |----LoginFrame

                                   |----.idea

                                   |----out

                                   |----src

                          |----MyNotepad

                                   |----.idea

                                   |----out

                                   |----src

       ……

二、主要功能需求分析

1、設計一個簡易計算器的GUI窗口,窗口標題上必須含有學生姓名信息。窗口外觀、按鈕顏色、佈局風格隨意,但要求簡潔、美觀可。

2、至少包含下圖所示的計算功能(加減乘除,正負數、次冪、求餘),如圖:

3、完成一個計算器其他應有的功能。

三、參考代碼

對一個網上比較小巧的計算器程序進行了修改,原作者的類設計規劃合理,代碼風格優良,註釋詳盡,非常值得借鑑。感謝原作者:https://blog.csdn.net/weixin_36279318/article/details/78486900

我在作者的設計上擴展幾個本次實訓作業需要完成的功能:

  • 1、←(退格鍵)
  • 2、± (正負數)
  • 3、^ (求次冪)
  • 4、%(求餘數)

實例截圖:

  

擴展版的參考代碼:

/**
 * 文件名:Calculator.java
 * 功能描述:簡易計算器
 */
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

@SuppressWarnings("serial")
class CalculatorPanel extends JPanel {
    private Font font = new Font(Font.MONOSPACED,Font.BOLD,14);
    private JPanel jp; // 中間的面板
    private double result; // 計算結果
    private boolean start; // 用於判斷是否是首次輸入,true首次,false不是首次
    private boolean flag; // 用於判斷是否清空顯示區域的值,true需要,false不需要
    private String lastCommand; // 用於保存運算符
    JTextField display; // 顯示區域

    public CalculatorPanel() {
        // 初始化各項值
        result = 0;
        start = true;
        flag = false;
        lastCommand = "=";

        // 設置CalculatorPanel這個面板的佈局爲框架佈局
        setLayout(new BorderLayout());
        // 這個按鈕用來顯示值的區域
        display = new JTextField("0.0",30);
        display.setFont(font);
        //將文本內容設置在文本框的左邊
        display.setHorizontalAlignment(display.RIGHT);
        display.setEnabled(false);// 按鈕樣式設置爲禁用樣式

        // 用來初始化,清除用的
        JButton clear = new JButton("清除");
        clear.setFont(font);
        clear.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 作初始化的操作
                result = 0;
                start = true;
                flag = false;
                lastCommand = "=";
                display.setText("0.0");
            }
        });

        jp = new JPanel();
        // 將此面板佈局設置爲網格佈局,4行4列
        jp.setLayout(new GridLayout(5, 4));

        // 實例化監聽器對象
        NumberAction numAction = new NumberAction();
        CommandAction cmdAction = new CommandAction();

        makeButton("7", numAction);
        makeButton("8", numAction);
        makeButton("9", numAction);
        makeButton("←", numAction);

        makeButton("4", numAction);
        makeButton("5", numAction);
        makeButton("6", numAction);
        makeButton("/", cmdAction);

        makeButton("1", numAction);
        makeButton("2", numAction);
        makeButton("3", numAction);
        makeButton("*", cmdAction);

        makeButton("0", numAction);
        makeButton(".", numAction);
        makeButton("=", cmdAction);
        makeButton("-", cmdAction);

        makeButton("±", cmdAction);
        makeButton("^", cmdAction);
        makeButton("%", cmdAction);
        makeButton("+", cmdAction);

        // 將面板,兩個按鍵加入到我的面板,實現計算器的界面
        add(display, BorderLayout.NORTH);
        add(jp, BorderLayout.CENTER);
        add(clear, BorderLayout.SOUTH);

    }

    private void makeButton(String buttonName, ActionListener al) {
        JButton jb = new JButton(buttonName);
        jb.setFont(font);
        jp.add(jb);
        jb.addActionListener(al);
    }

    // 數字監聽器
    private class NumberAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            JButton jb = (JButton) e.getSource(); // 獲取事件源對象
            String input = jb.getText(); // 獲取事件源對象上的標籤
            if (start) { // 首次輸入
                // 一上就".",就什麼也不做
                if (input.equals(".")) {
                    return;
                }
                if (input.equals("←")) {
                    return;
                }
                // 如果是"0.0"的話,就清空
                if (display.getText().equals("0.0")) {
                    display.setText("");
                }
                start = false;// 改變是否首次輸入的標記值
            } else {
                if (input.equals("←")) {
                    String s = display.getText();
                    if (Math.abs(Double.valueOf(display.getText()))>0.0) {
                        s = s.substring(0,s.length()-1);
                        if (s.equals("")) {
                            s = "0.0";
                            start = true;
                        }
                        display.setText(s);
                    }
                    return;
                }
                // 判斷顯示區域的值裏面是否已經有".",如果有,輸入的又是".",就什麼都不做
                if (display.getText().indexOf(".") != -1) {
                    if (input.equals(".")) {
                        return;
                    }
                }

                // 判斷顯示區域的值裏面只有"-",輸入的又是".",就什麼都不做
                if (display.getText().equals("-")) {
                    if (input.equals(".")) {
                        return;
                    }
                }

                // 判斷顯示區域的值如果是"0",輸入的不是".",就什麼也不做
                if (display.getText().equals("0")) {
                    if (!input.equals(".")) {
                        return;
                    }
                }
            }
            // 如果我點擊了運算符以後,再輸入數字的話,就要清空顯示區域的值
            if (flag) {
                display.setText("");
                flag = false;// 還原初始值,不需要清空
            }
            display.setText(display.getText() + input);// 設置顯示區域的值
        }
    }

    // 運算符監聽器
    private class CommandAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            JButton jb = (JButton) e.getSource(); // 獲取事件源對象
            String inputCommand = jb.getText(); // 獲取事件源對象上的標籤

            if (start) {// 首次輸入
                // 一上就是"-"
                if (inputCommand.equals("-") || inputCommand.equals("±")) {
                    display.setText("-");// 顯示區域的內容設置爲"-"
                    start = false;// 改變首次輸入的標記
                }
            } else {
                if (inputCommand.equals("±")) {
                    double x = Double.parseDouble(display.getText());
                    x = -x;
                    display.setText(String.valueOf(x));
                    return;
                }

                if (!flag) {// 如果flag=false不需要清空顯示區的值,就調用方法計算
                    calculate(Double.parseDouble(display.getText()));// 保存顯示區域的值,並計算
                }
                // 保存你點擊的運算符
                lastCommand = inputCommand;
                flag = true;// 因爲我這裏已經輸入過運算符,
            }
        }
    }

    // 計算用的方法
    private void calculate(double x) {
        if (lastCommand.equals("+")) {
            result += x;
        } else if (lastCommand.equals("-")) {
            result -= x;
        } else if (lastCommand.equals("*")) {
            result *= x;
        } else if (lastCommand.equals("/")) {
            result /= x;
        } else if (lastCommand.equals("%")) {
            result %= x;
        } else if (lastCommand.equals("^")) {
            result = Math.pow(result,x);
        } else if (lastCommand.equals("±")) {
            result = -result;
        } else if (lastCommand.equals("=")) {
            result = x;
        }
        display.setText("" + result);
    }
}

class MyFrameUitl {
    public static void init(JFrame jFrame, Dimension frameSize, String title,
                            String iconFileName, boolean resizable) {
        // 系統工具包,可以讀取系統信息
        Toolkit tk = Toolkit.getDefaultToolkit();
        // 獲取屏幕大小
        Dimension screenSize = tk.getScreenSize();
        // 獲取寬高
        int screenWidth = screenSize.width;
        int screenHeight = screenSize.height;

        // 找中心點
        int centerX = screenWidth / 2;
        int centerY = screenHeight / 2;

        // 解析窗體大小
        int frameWidth = frameSize.width;
        int frameHeight = frameSize.height;

        // 設置窗體位置
        jFrame.setBounds(centerX - frameWidth / 2, centerY - frameHeight / 2,
                frameWidth, frameHeight);
        jFrame.setTitle(title);// 設置標題
        if (iconFileName != null) {
            jFrame.setIconImage(tk.getImage(iconFileName));// 設置圖標
        }

        // 設置皮膚com.sun.java.swing.plaf.windows.WindowsLookAndFeel
        /**/
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
            SwingUtilities.updateComponentTreeUI(jFrame);
        } catch (Exception e1) {
            e1.printStackTrace();
        }

        jFrame.setLocationRelativeTo(null);
        jFrame.setResizable(resizable);// 設置窗體是否可以改變大小
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 設置程序關閉動作
        jFrame.setVisible(true);// 顯示窗體

    }
}

class CalculatorFrame extends JFrame {
    public CalculatorFrame() {
        add(new CalculatorPanel());
        MyFrameUitl.init(this, new Dimension(800, 600), "簡易計算器(xieyunc)", null,
                false);
        // 讓組件按原始大小顯示,並且窗體的大小剛好能夠容納所有的組件
        this.pack();
    }
}

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


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章