package begin;
/*
计算器:
1.显示共两行,上为计算过程,下为计算结果或输入数字
2.可同时实现多个实数的四则运算。
3。运算范围为double。
4.可按钮输入,也可键盘输入。
5.每次只能从最高位向最低位输入。
6.键盘输入加减乘除与按钮加减乘除有所不同,键盘输入的运算符会保留在输入栏。( 尚未找到解决方法 )
7.只能输入数字、加、减、乘、除、等于、换行(回车)符,一个实数亦只能有一个小数点,若输入错误,计算将重新开始。
*/
public class MainClass {
public static void main(String arg[]){
Calculator test = new Calculator();
test.display();
}
}
代码不难理解,就不解释了,直接上代码
package begin;
import java.math.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Calculator extends JFrame {
private JTextField tf1,tf2; //过程框,输入及结果框
private JButton btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn0,btnp;
private JButton addBtn,subBtn,mulBtn,divBtn,equalBtn;
private int cWidth=300, cHeight=400;
private long count=0L; //运算符号数目
private double a=0,x=0; //输入数字,运算结果
private int mode=1; //运算模式
private double pointX=0; //小数位
private boolean flag =true; //当前是否为a的第一个数字
private boolean flagKey = false ; //当前是否为键盘输入
private double stackNum[] = new double[100];
private int top=-1;
Calculator(){
super("计算器");
super.setResizable(false);
int sx=10,sy=10,dx=10,tfH=50,dy=10,btnDx=25;
tf1 = new JTextField();
tf1.setEditable(false);
tf1.setBounds(sx, sy,cWidth-2*sx , tfH);
tf1.setHorizontalAlignment(JTextField.RIGHT);
tf1.setBackground(Color.WHITE);
tf1.setBorder(null);
tf1.setFont(new Font("Times",Font.CENTER_BASELINE,15));
tf2 = new JTextField();
tf2.setEditable(true);
tf2.setBounds(sx, sy+tfH,cWidth-2*sx , tfH);
tf2.setHorizontalAlignment(JTextField.RIGHT);
tf2.setBorder(null);
tf2.setFont(new Font("Times",Font.BOLD,20));
int btnW=(cWidth-2*sx-3*btnDx)/4,btnH=btnW-btnW%10;
sy=sy+tfH+tfH;
addBtn = new JButton("+");
addBtn.setFont(new Font("Times",Font.BOLD,20));//字体,粗体,字号
addBtn.setBounds(sx, sy+dy, btnW, btnH);
subBtn = new JButton("-");
subBtn.setBounds(sx+btnDx+btnW, sy+dy, btnW, btnH);
subBtn.setFont(new Font("Times",Font.BOLD,20));
mulBtn = new JButton("*");
mulBtn.setBounds(sx+2*(btnDx+btnW), sy+dy, btnW, btnH);
mulBtn.setFont(new Font("Times",Font.BOLD,20));
divBtn = new JButton("/");
divBtn.setBounds(sx+3*(btnDx+btnW), sy+dy, btnW, btnH);
divBtn.setFont(new Font("Times",Font.BOLD,20));
sy=sy+dy+btnH+dy;
btn1 = new JButton("1");
btn1.setBounds(sx, sy, btnW, btnW);
btn2 = new JButton("2");
btn2.setBounds(sx+btnDx+btnW , sy, btnW, btnW);
btn3 = new JButton("3");
btn3.setBounds(sx+2*(btnDx+btnW), sy, btnW, btnW);
btn0 = new JButton("0");
btn0.setBounds(sx+3*(btnDx+btnW), sy, btnW, btnW);
sy+=dy+btnH;
btn4 = new JButton("4");
btn4.setBounds(sx, sy, btnW, btnW);
btn5 = new JButton("5");
btn5.setBounds(sx+btnDx+btnW , sy, btnW, btnW);
btn6 = new JButton("6");
btn6.setBounds(sx+2*(btnDx+btnW), sy, btnW, btnW);
btnp = new JButton(".");
btnp.setBounds(sx+3*(btnDx+btnW), sy, btnW, btnW);
btnp.setFont(new Font("Times",Font.BOLD,20));
sy+=dy+btnH;
btn7 = new JButton("7");
btn7.setBounds(sx, sy, btnW, btnW);
btn8 = new JButton("8");
btn8.setBounds(sx+btnDx+btnW , sy, btnW, btnW);
btn9 = new JButton("9");
btn9.setBounds(sx+2*(btnDx+btnW), sy, btnW, btnW);
equalBtn = new JButton("=");
equalBtn.setBounds(sx+3*(btnDx+btnW), sy, btnW, btnW);
equalBtn.setFont(new Font("Times",Font.BOLD,20));
}
public void display(){
Container c = this.getContentPane();
c.setLayout(null);
c.add(tf1);
c.add(tf2);
c.add(addBtn);
c.add(subBtn);
c.add(mulBtn);
c.add(divBtn);
c.add(btn0);
c.add(btn1);
c.add(btn2);
c.add(btn3);
c.add(btn4);
c.add(btn5);
c.add(btn6);
c.add(btn7);
c.add(btn8);
c.add(btn9);
c.add(btnp);
c.add(equalBtn);
MyEventHandler handler = new MyEventHandler();
btn0.addActionListener(handler);
btn1.addActionListener(handler);
btn2.addActionListener(handler);
btn3.addActionListener(handler);
btn4.addActionListener(handler);
btn5.addActionListener(handler);
btn6.addActionListener(handler);
btn7.addActionListener(handler);
btn8.addActionListener(handler);
btn9.addActionListener(handler);
btnp.addActionListener(handler);
addBtn.addActionListener(handler);
subBtn.addActionListener(handler);
mulBtn.addActionListener(handler);
divBtn.addActionListener(handler);
equalBtn.addActionListener(handler);
MyKeyHandler keyHandler = new MyKeyHandler();
tf2.addKeyListener(keyHandler);
this.setSize(cWidth,cHeight);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
private class MyEventHandler implements ActionListener{
public void actionPerformed(ActionEvent e){
if(e.getSource()==btn1){
flagKey = false;
in1();
}
if(e.getSource()==btn2){
flagKey = false;
in2();
}
if(e.getSource()==btn3){
flagKey = false;
in3();
}
if(e.getSource()==btn4){
flagKey = false;
in4();
}
if(e.getSource()==btn5){
flagKey = false;
in5();
}
if(e.getSource()==btn6){
flagKey = false;
in6();
}
if(e.getSource()==btn7){
flagKey = false;
in7();
}
if(e.getSource()==btn8){
flagKey = false;
in8();
}
if(e.getSource()==btn9){
flagKey = false;
in9();
}
if(e.getSource()==btn0){
flagKey = false;
in0();
}
if(e.getSource()==btnp){
flagKey = false;
inp();
}
if(e.getSource()==addBtn){
flagKey = false;
inadd();
}
if(e.getSource()==subBtn){
flagKey = false;
insub();
}
if(e.getSource()==mulBtn){
flagKey = false;
inmul();
}
if(e.getSource()==divBtn){
flagKey = false;
indiv();
}
if(e.getSource()==equalBtn){
flagKey = false;
inequal();
}
}
}
private void in1(){
if(flagKey == false){
String str = "1";
if(flag)
str = tf2.getText() + "1";
else
flag = true;
tf2.setText(str);
}
if(pointX>0){
a+=1.0/pointX;
pointX*=10;
}
else
a = a*10 + 1;
}
private void in2(){
if(flagKey == false){
String str = "2";
if(flag)
str = tf2.getText()+"2";
else
flag = true;
tf2.setText(str);
}
if(pointX>0){
a+=2.0/pointX;
pointX*=10;
}
else
a = a*10 + 2;
}
private void in3(){
if(flagKey == false){
String str = "3";
if(flag)
str = tf2.getText()+"3";
else
flag = true;
tf2.setText(str);
}
if(pointX>0){
a+=3.0/pointX;
pointX*=10;
}
else
a = a*10 + 3;
}
private void in4(){
if(flagKey == false){
String str = "4";
if(flag)
str = tf2.getText()+"4";
else
flag = true;
tf2.setText(str);
}
if(pointX>0){
a+=4.0/pointX;
pointX*=10;
}
else
a = a*10 + 4;
}
private void in5(){
if(flagKey == false){
String str = "5";
if(flag)
str = tf2.getText()+"5";
else
flag = true;
tf2.setText(str);
}
if(pointX>0){
a+=5.0/pointX;
pointX*=10;
}
else
a = a*10 + 5;
}
private void in6(){
if(flagKey == false){
String str = "6";
if(flag)
str = tf2.getText()+"6";
else
flag = true;
tf2.setText(str);
}
if(pointX>0){
a+=6.0/pointX;
pointX*=10;
}
else
a = a*10 + 6;
}
private void in7(){
if(flagKey == false){
String str = "7" ;
if(flag)
str = tf2.getText()+"7";
else
flag = true;
tf2.setText(str);
}
if(pointX>0){
a+=7.0/pointX;
pointX*=10;
}
else
a = a*10 + 7;
}
private void in8(){
if(flagKey == false){
String str = "8";
if(flag)
str = tf2.getText()+"8";
else
flag = true;
tf2.setText(str);
}
if(pointX>0){
a+=8.0/pointX;
pointX*=10;
}
else
a = a*10 + 8;
}
private void in9(){
if(flagKey == false){
String str = "9";
if(flag)
str = tf2.getText()+"9";
else
flag = true;
tf2.setText(str);
}
if(pointX>0){
a+=9.0/pointX;
pointX*=10;
}
else
a = a*10 + 9;
}
private void in0(){
if(flagKey == false){
String str = "0";
if(flag)
str = tf2.getText()+"0";
else
flag = true;
tf2.setText(str);
}
if(pointX>0){
a+=0.0/pointX;
pointX*=10;
}
else
a = a*10 + 0;
}
private void inp(){
if(pointX>0){
infalse();
return;
}
if(flagKey == false){
String str = "0.";
if(flag)
str = tf2.getText()+".";
else
flag = true;
tf2.setText(str);
}
pointX=10;
}
private void inadd(){
count++;
switch(mode){
case 1:stackNum[++top] = a;x+=a;break;
case 2:stackNum[++top] = -a;x-=a;break;
case 3:
case 4:stackNum[top] = Calculate(stackNum[top],a);x+= stackNum[top];
}
String ac=Double.toString(a),
xc=Double.toString(x);
if(count==1){
tf1.setText(xc.toString()+'+');
tf2.setText("");
}
else{
String str1 = tf1.getText() + ac+'+';
tf1.setText(str1);
tf2.setText(xc);
}
a=0;
mode=1;
flag=false;
pointX=0;
}
private void insub(){
count++;
switch(mode){
case 1:stackNum[++top] = a;x+=a;break;
case 2:stackNum[++top] = -a;x-=a;break;
case 3:
case 4:stackNum[top] = Calculate(stackNum[top],a);x+= stackNum[top];
}
String ac=Double.toString(a),
xc=Double.toString(x);
if(count==1){
tf1.setText(xc.toString()+'-');
tf2.setText("");
}
else{
String str1 = tf1.getText() + ac+'-';
tf1.setText(str1);
tf2.setText(xc);
}
a=0L;
mode=2;
flag=false;
pointX=0;
}
private void inmul(){
count++;
if(mode<3||top==-1){
if(mode==1)
stackNum[++top] = a;
else
stackNum[++top] = -a;
}
else{
//System.out.println(stackNum[top]);
stackNum[top]=Calculate(stackNum[top],a); //此时 stackNum[top]i-1 = ai*ai-1 或 ai/ai-1
}
String ac=Double.toString(a),
xc=Double.toString(x);
if(count==1){
tf1.setText(ac.toString()+'*');
tf2.setText("");
}
else{
String str1 = tf1.getText() + ac+'*';
tf1.setText(str1);
tf2.setText(xc);
}
a=0;
mode=3;
flag=false;
pointX=0;
}
private void indiv(){
count++;
if(mode<3||top==-1){
if(mode==1)
stackNum[++top] = a;
else
stackNum[++top] = -a;
}
else{
//System.out.println(stackNum[top]);
stackNum[top]=Calculate(stackNum[top],a); //此时 stackNum[top]i-1 = ai*ai-1 或 ai/ai-1
}
String ac=Double.toString(a),
xc=Double.toString(x);
if(count==1){
tf1.setText(xc.toString()+'/');
tf2.setText("");
}
else{
String str1 = tf1.getText() + ac+'/';
tf1.setText(str1);
tf2.setText(xc);
}
a=0;
mode=4;
flag=false;
pointX=0;
}
private void inequal(){
switch(mode){
case 1:x+=a;break;
case 2:x-=a;break;
case 3:
case 4:stackNum[top] = Calculate(stackNum[top],a);x+= stackNum[top];
}
String xc=Double.toString(x);
tf1.setText("");
tf2.setText(xc);
//清空
top=-1;
count=0;
a=0;
mode=1;
flag=false;
pointX=0;
x=0;
}
private void infalse(){
JOptionPane.showMessageDialog(null, "输入数据有误,计算重新开始!");
tf1.setText("");
tf2.setText("");
count=0;
a=0;
mode=1;
flag=false;
pointX=0;
x=0;
}
private double Calculate(Double y,Double z){
if(mode==1)
return y+z;
if(mode==2)
return y-z;
if(mode==3)
return y*z;
else
return y/z;
}
private class MyKeyHandler extends KeyAdapter{
public void keyTyped(KeyEvent e){
if(e.getKeyChar()=='\n'||e.getKeyChar()=='='){
inequal();
}
else if(e.getKeyChar()=='+'){
//tf2.setText("");
inadd();
}
else if(e.getKeyChar()=='-'){
insub();
}
else if(e.getKeyChar()=='*'){
inmul();
}
else if(e.getKeyChar()=='/'){
indiv();
}
else if(e.getKeyChar()=='0'){
flagKey = true;
in0();
}
else if(e.getKeyChar()=='1'){
flagKey = true;
in1();
}
else if(e.getKeyChar()=='2'){
flagKey = true;
in2();
}
else if(e.getKeyChar()=='3'){
flagKey = true;
in3();
}
else if(e.getKeyChar()=='4'){
flagKey = true;
in4();
}
else if(e.getKeyChar()=='5'){
flagKey = true;
in5();
}
else if(e.getKeyChar()=='6'){
flagKey = true;
in6();
}
else if(e.getKeyChar()=='7'){
flagKey = true;
in7();
}
else if(e.getKeyChar()=='8'){
flagKey = true;
in8();
}
else if(e.getKeyChar()=='9'){
flagKey = true;
in9();
}
else if(e.getKeyChar()=='.'){
flagKey = true;
inp();
}
else{
infalse();
}
}
}
}
运行结果