import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MathCalc extends JFrame{
JTextField textDisplay;
public String [] name={"1","2","3","4","5","6","7","8","9","0",".","c","+","-","*","/","1/x","+/-","="};
JButton [] button=new JButton[name.length];
JButton btn;
double Operand1;
double result=0;
boolean ClearDisplay;
String Operator;
public MathCalc(){
textDisplay=new JTextField(20);
for(int i=0;i<name.length;i++)
button[i]=new JButton(name[i]);
for(int i=0;i<name.length-1;i++)
button[i].setPreferredSize(new Dimension(52,28));
button[18].setPreferredSize(new Dimension(105,28));
layoutComponents(); //加入按钮
registerEventHander(); //按钮注册事件监听程序
setTitle("计算器");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
private void layoutComponents(){ //布局按钮面板
Container contentPane=getContentPane();
contentPane.setLayout(new GridLayout(5,1));
JPanel TextPane=new JPanel();
TextPane.add(textDisplay);
JPanel buttonPane0 = new JPanel();
JPanel buttonPane1 = new JPanel();
JPanel buttonPane2 = new JPanel();
JPanel buttonPane3 = new JPanel();
for(int i=0;i<=2;i++)
{
buttonPane0.add(button[i]);
buttonPane0.add(button[10]);
buttonPane0.add(button[11]);
}
for(int i=3;i<=5;i++)
{
buttonPane1.add(button[i]);
buttonPane1.add(button[12]);
buttonPane1.add(button[13]);
}
for(int i=6;i<=8;i++)
{
buttonPane2.add(button[i]);
buttonPane2.add(button[14]);
buttonPane2.add(button[15]);
}
buttonPane3.add(button[9]);
buttonPane3.add(button[16]);
buttonPane3.add(button[17]);
buttonPane3.add(button[18]);
contentPane.add(TextPane);
contentPane.add(buttonPane0);
contentPane.add(buttonPane1);
contentPane.add(buttonPane2);
contentPane.add(buttonPane3);
}
public static void main(String args[]){ //main函数
JFrame.setDefaultLookAndFeelDecorated(true);
MathCalc mathcal=new MathCalc();
mathcal.setVisible(true);
}
private void registerEventHander(){ //注册数字按钮事件
btnNumberEventHander number=new btnNumberEventHander();
for(int i=0;i<=10;i++)
button[i].addActionListener(number);
btnAlcEventHander alc=new btnAlcEventHander(); //运算符按钮注册事件监听程序
for(int i=12;i<=15;i++)
button[i].addActionListener(alc);
btnAccessEventHander access=new btnAccessEventHander(); //注册“=”的监听事件
button[18].addActionListener(access);
btnAcEventHander clear=new btnAcEventHander(); //注册清零键按钮事件
button[11].addActionListener(clear);
btnChangeEventHander change= new btnChangeEventHander(); //注册“+/-”按钮事件
button[17].addActionListener(change);
btnXEventHander d=new btnXEventHander();
button[16].addActionListener(d); //注册1/x键按钮事件
}
private class btnNumberEventHander implements ActionListener{ //数字按钮事件
public void actionPerformed(ActionEvent e){
JButton btn=(JButton)e.getSource();
if(ClearDisplay){
textDisplay.setText("");
ClearDisplay=false;
}
int n=countdot(textDisplay.getText());
if(btn.getText()==".")
{
if(textDisplay.getText().equals("")||n==1) //处理多个小数点问题
JOptionPane.showMessageDialog(null, "不能有多个小数点,小数点不能放在第一位!");
else textDisplay.setText(textDisplay.getText()+btn.getText());
}
else textDisplay.setText(textDisplay.getText()+btn.getText());
}
}
private class btnAlcEventHander implements ActionListener{ //处理运算符按钮事件
public void actionPerformed(ActionEvent e){
JButton btnalc=(JButton)e.getSource();
Operator=btnalc.getText();
Operand1=Double.parseDouble(textDisplay.getText());
textDisplay.setText("");
}
}
private class btnAccessEventHander implements ActionListener{ //等号(=)事件处理程序
public void actionPerformed(ActionEvent e){
double Operand2=Double.parseDouble(textDisplay.getText());
if(Operator.equals("+"))
result=Operand1+Operand2;
else if(Operator.equals("-"))
result=Operand1-Operand2;
else if(Operator.equals("*"))
result=Operand1*Operand2;
else {
if(Operand2!=0)
result=Operand1/Operand2;
else {
JOptionPane.showMessageDialog(null, "除数不能为零,结果出错!");
}
}
textDisplay.setText(""+result);
ClearDisplay=true;
}
}
private class btnAcEventHander implements ActionListener{ //清零键注册事件
public void actionPerformed(ActionEvent e){
textDisplay.setText("");
Operator="";
Operand1=0;
result=0;
}
}
private class btnChangeEventHander implements ActionListener{ //"+/-"按钮事件处理程序
public void actionPerformed(ActionEvent e){
result=-Double.parseDouble(textDisplay.getText());
textDisplay.setText(String.valueOf(result));
}
}
private class btnXEventHander implements ActionListener{ //1/x按钮事件处理程序
public void actionPerformed(ActionEvent e){
if(textDisplay.getText().equals("0"))
JOptionPane.showMessageDialog(null, "除数不能为零,请重新输入!");
else {
result=1.0/Double.parseDouble(textDisplay.getText());
textDisplay.setText(String.valueOf(result));
ClearDisplay=true;
}
}
}
int countdot(String s) { //处理多个小数点问题函数
int count=0;
for(int i=0;i<s.length();i++)
{
char ss=s.charAt(i);
if(ss=='.')
count++;
}
return count;
}
}