자바 의 작은 예:베테랑 은 계산 기 를 어떻게 만 듭 니까?

             ,                。       ,         if-else。                。     。

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
 
/**
 *      。MyCalculator     JFrame,       
 */
public class MyCalculator extends JFrame {
 
    private Border border = BorderFactory.createEmptyBorder(5, 5, 5, 5);
 
    private JTextField textbox = new JTextField("0");
 
    private CalculatorCore core = new CalculatorCore();
 
    private ActionListener listener = new ActionListener() {
 
        public void actionPerformed(ActionEvent e) {
            JButton b = (JButton) e.getSource();
            String label = b.getText();
            String result = core.process(label);
            textbox.setText(result);
        }
    };
 
    public MyCalculator(String title) throws HeadlessException {
        super(title);       //         
        setupFrame();       //       
        setupControls();    //     
    }
 
    private void setupControls() {
        setupDisplayPanel();    //       
        setupButtonsPanel();    //       
    }
 
    //            
    private void setupButtonsPanel() {
        JPanel panel = new JPanel();
        panel.setBorder(border);
        panel.setLayout(new GridLayout(4, 5, 3, 3));
 
        createButtons(panel, new String[]{
                "7", "8", "9", "+", "C",
                "4", "5", "6", "-", "CE",
                "1", "2", "3", "*", "",  //               
                "0", ".", "=", "/", ""
        });
 
        this.add(panel, BorderLayout.CENTER);
    }
 
    /**
     *            
     *
     * @param panel          
     * @param labels     
     */
    private void createButtons(JPanel panel, String[] labels) {
        for (String label : labels) {
            //    label   ,          。        。
            if (label.equals("")) {
                panel.add(new JPanel());
 
            } else {
                JButton b = new JButton(label);
                b.addActionListener(listener);  //         
                panel.add(b);
            }
        }
    }
 
    //       ,                 。
    private void setupDisplayPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.setBorder(border);
 
        setupTextbox();
        panel.add(textbox, BorderLayout.CENTER);
        this.add(panel, BorderLayout.NORTH);
    }
 
    //      
    private void setupTextbox() {
        textbox.setHorizontalAlignment(JTextField.RIGHT);   //      
        textbox.setEditable(false);                         //      
        textbox.setBackground(Color.white);                 //          
    }
 
    //     
    private void setupFrame() {
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);   //           
        this.setLocation(100, 50);      //              
        this.setSize(300, 200);         //       
        this.setResizable(false);       //       
    }
 
    //     
    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        MyCalculator frame = new MyCalculator("     ");
        frame.setVisible(true);          //         
    }
}
 
/**
 *        。         1~2      。
 */
class CalculatorCore {
 
    private String displayText = "0";   //       
 
    boolean reset = true;
 
    private BigDecimal number1, number2;
 
    private String operator;
 
    private HashMap<String, Operator> operators = new HashMap<String, Operator>();
 
    private HashMap<String, Processor> processors = new HashMap<String, Processor>();
 
    CalculatorCore() {
        setupOperators();
        setupProcessors();
    }
 
    //            
    private void setupProcessors() {
        processors.put("[0-9]", new Processor() {
            public void calculate(String command) {
                numberClicked(command);
            }
        });
        processors.put("\\.", new Processor() {
            public void calculate(String command) {
                dotClicked();
            }
        });
        processors.put("=", new Processor() {
            public void calculate(String command) {
                equalsClicked();
            }
        });
        processors.put("[+\\-*/]", new Processor() {
            public void calculate(String command) {
                operatorClicked(command);
            }
        });
        processors.put("C", new Processor() {
            public void calculate(String command) {
                clearClicked();
            }
        });
        processors.put("CE", new Processor() {
            public void calculate(String command) {
                clearErrorClicked();
            }
        });
    }
 
    //     operator       
    private void setupOperators() {
        operators.put("+", new Operator() {
            public BigDecimal process(BigDecimal number1, BigDecimal number2) {
                return number1.add(number2);
            }
        });
        operators.put("-", new Operator() {
            public BigDecimal process(BigDecimal number1, BigDecimal number2) {
                return number1.subtract(number2);
            }
        });
        operators.put("*", new Operator() {
            public BigDecimal process(BigDecimal number1, BigDecimal number2) {
                return number1.multiply(number2);
            }
        });
        operators.put("/", new Operator() {
            public BigDecimal process(BigDecimal number1, BigDecimal number2) {
                return number1.divide(number2, 30, RoundingMode.HALF_UP);
            }
        });
    }
 
    //       。              。
    public String process(String command) {
        for (String pattern : processors.keySet()) {
            if (command.matches(pattern)) {
                processors.get(pattern).calculate(command);
                break;
            }
        }
 
        return displayText;
    }
 
    //     CE  
    private void clearErrorClicked() {
        if (operator == null) {
            number1 = null;
        } else {
            number2 = null;
        }
        displayText = "0";
        reset = true;
    }
 
    //     C  ,          。
    private void clearClicked() {
        number1 = null;
        number2 = null;
        operator = null;
        displayText = "0";
        reset = true;
    }
 
    //     =  
    private void equalsClicked() {
        calculateResult();
        number1 = null;
        number2 = null;
        operator = null;
        reset = true;
    }
 
    //     
    private void calculateResult() {
        number2 = new BigDecimal(displayText);
        Operator oper = operators.get(operator);
        if (oper != null) {
            BigDecimal result = oper.process(number1, number2);
            displayText = result.toString();
        }
    }
 
    //     +-*/  (               )
    private void operatorClicked(String command) {
        if (operator != null) {
            calculateResult();
        }
 
        number1 = new BigDecimal(displayText);
        operator = command;
 
        reset = true;
    }
 
    //     .  
    private void dotClicked() {
        if (displayText.indexOf(".") == -1) {
            displayText += ".";
        } else if (reset) {
            displayText = "0.";
        }
        reset = false;
    }
 
    //     0-9  
    private void numberClicked(String command) {
        if (reset) {
            displayText = command;
        } else {
            displayText += command;
        }
        reset = false;
    }
 
    //        
    interface Operator {
 
        BigDecimal process(BigDecimal number1, BigDecimal number2);
    }
 
    //       
    interface Processor {
 
        void calculate(String command);
    }
 
}

좋은 웹페이지 즐겨찾기