CalculatorMainClass.java
public class CalculatorMainClass {
public static void main(String args[]) {
CalculatorFrame Calculator=new CalculatorFrame();
Calculator.setBounds(0,0,360,300);
Calculator.setVisible(true);
}
}
CalculatorFrame.java
import java.awt.BorderLayout;
import java.awt.GridLayout;
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 java.awt.Font;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
public class CalculatorFrame extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
JButton CE=new JButton("CE");
JTextField TextField=new JTextField();
String[] str={"7","8","9","/","4","5","6","*","1","2","3","-",".","0","=","+"};
JButton[] Buttons=new JButton[str.length];
StringBuffer strBuffer=new StringBuffer();
public CalculatorFrame(){
super("计算器-屠柯");
JPanel Panel=new JPanel(new BorderLayout());
TextField.setFont(new Font("宋体", Font.PLAIN, 40));
TextField.setEditable(false);
TextField.setHorizontalAlignment(JTextField.RIGHT);//设置水平对其方式为右侧
CE.setFont(new Font("宋体", Font.BOLD, 20));
CE.setActionCommand("clear");
CE.addActionListener(this);
Panel.add("Center",TextField);
Panel.add("East",CE);
//把按钮加入画板
JPanel Panel1 = new JPanel(new GridLayout(4, 4));
for (int i = 0; i < str.length; i++) {
Buttons[i] = new JButton(str[i]);
Buttons[i].setFont(new Font("宋体", Font.BOLD, 20));
Panel1.add(Buttons[i]);
}
//每个按钮设置监听器
for(int i=0;i<str.length;i++){
Buttons[i].addActionListener(this);
if(Buttons[i].getText().equals("=")){
Buttons[i].setActionCommand("equal");
}
else {
Buttons[i].setActionCommand("common");
}
}
getContentPane().setLayout(new BorderLayout());
getContentPane().add("North", Panel);
getContentPane().add("Center", Panel1);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("common")){
JButton b=(JButton)e.getSource();
strBuffer.append(b.getText());
TextField.setText(strBuffer.toString());
TextField.repaint();//刷新界面
}
else if(e.getActionCommand().equals("equal")){
DecimalFormat df = new DecimalFormat(",##0.00");
String s=df.format(ComputerNum(strBuffer.toString()));//将sum保留两位小数
TextField.setText(s);
strBuffer.delete(0,strBuffer.length());//strBuffer清空
TextField.repaint();
}
else if(e.getActionCommand().equals("clear")){
strBuffer.delete(0,strBuffer.length());//strBuffer清空
TextField.setText("0");
}
}
//计算输入值
public Double ComputerNum(String text){
// 计算内容按符号分割
List<String> numList = new ArrayList<String>();
int splitIndex = 0;
for(int i=0;i<text.length();i++){
char c = text.charAt(i);
if(c == '+'||c == '-'||c=='*'||c=='/'){
numList.add(text.substring(splitIndex, i));
numList.add(c+"");
splitIndex = i+1;
}
}
// 因为使用符号做判断,增加前一位和符号,所以最后一位数字不会在循环里处理
numList.add(text.substring(splitIndex, text.length()));
/* System.out.println("====分割后====");
for(int i=0;i<numList.size();i++){
System.out.println(i + " -> " + numList.get(i));
} */
// 先做乘除计算
List<String> list = new ArrayList<String>();
Double temp = null; // 用于做乘除计算临时变量
for(int i=1;i<numList.size();i+=2){ // 这里只循环运算符号
if("+".equals(numList.get(i))||"-".equals(numList.get(i))){
if(null != temp){ // 存在临时变量,说明前面进行过乘除计算
list.add(temp.toString());
temp = null;
} else {
list.add(numList.get(i-1));
}
list.add(numList.get(i)); // 把符号加进去
if(i==numList.size()-2) { // 处理到最后时遇到直接处理
list.add(numList.get(i+1));
}
}else if("*".equals(numList.get(i))){
if(null == temp){
temp = Double.parseDouble(numList.get(i-1)) * Double.parseDouble(numList.get(i+1));
}else{
temp = temp * Integer.parseInt(numList.get(i+1));
}
if(i==numList.size()-2) { // 处理到最后时遇到直接处理
list.add(temp.toString());
temp = null;
}
}else if("/".equals(numList.get(i))){
if(null == temp){
temp = Double.parseDouble(numList.get(i-1)) /Double.parseDouble(numList.get(i+1));
}else{
temp = temp / Double.parseDouble(numList.get(i+1));
}
if(i==numList.size()-2) { // 处理到最后时遇到直接处理
list.add(temp.toString());
temp = null;
}
}
}
/*System.out.println("====乘除后====");
for(int i=0;i<list.size();i++){
System.out.println(i + " -> " + list.get(i));
} */
// 再做加减计算
Double sum = Double.parseDouble(list.get(0)); // 第一位不会在循环里处理
for(int i=1;i<list.size();i+=2){ // 这里只循环运算符号
if("+".equals(list.get(i))){
sum += Integer.parseInt(list.get(i+1));
}else if("-".equals(list.get(i))){
sum -= Integer.parseInt(list.get(i+1));
}
}
return sum;
}
}