package boom;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 static final long serialVersionUID = 1L;
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);
}}
温馨提示:内容为网友见解,仅供参考