import java.awt.*;
import java.awt.event.*;import javax.swing.*;public class Jsq extends WindowAdapter implements ActionListener {
String[] originalKey = { "7", "8", "9", "/", "sqrt", "4", "5", "6",
"*", "%", "1", "2", "3", "-", "1/x", "0", "+/-", ".", "+", "="};
JFrame frame;
JButton key[]= new JButton[originalKey.length]; 
JTextArea ta;
boolean flag = true ;
String operator = "=";
boolean operateValidFlag = true;
double resultNum = 0.0;

public static void main(String args[]){
Jsq that=new Jsq();
that.go();
}

public void go(){
frame = new JFrame("Calulator");
Container cp = frame.getContentPane();
ta.setBackground(Color.LIGHT_GRAY);
ta.setOpaque(false);

JPanel allPanel = new JPanel();
allPanel.setLayout(new GridLayout(2,1));
cp.add(allPanel);

JPanel keyPanel = new JPanel();
allPanel.add(keyPanel);
keyPanel.setLayout(new GridLayout(4,5,3,3));
for(int i = 0;i<=originalKey.length;i++){
key[i] = new JButton(originalKey[i]);
keyPanel.add(key[i]);
key[i].setForeground (Color.red);
}

for(int i = 0;i<=originalKey.length;i++){
key[i].addActionListener(this);
}

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(500,300);
frame.setSize(300,300);
frame.setVisible(true);
} public void actionPerformed(ActionEvent e){
String label = e.getActionCommand();
if("0123456789.".indexOf(label) >= 0){
handleKey(label);
}else{
handleBackspace();
}
} private void handleBackspace(){
String text = ta.getText();
int i = text.length();
if (i > 0) {
text = text.substring(0, i - 1);
if (text.length() == 0) {
ta.setText("0");
flag = true;
operator = "=";
} else {
ta.setText(text);
}
}
} private void handleKey(String key){
if(flag){
ta.setText(key);
}else if((key.equals(".")) && (ta.getText().indexOf(".") < 0)){
ta.setText(ta.getText()+".");
}else if(!key.equals(".")){
ta.setText(ta.getText()+key);
}
flag = false ;
}

public void handleFunction(String key){
if (operator.equals("/")) {
if (getNumberFromText() == 0.0) {
operateValidFlag = false;
ta.setText("zero should not be divisor");
} else {
resultNum /= getNumberFromText();
}
} else if (operator.equals("1/x")) {
if (resultNum == 0.0) {
operateValidFlag = false;
ta.setText("zero do not have count backwards");
} else {
resultNum = 1 / resultNum;
}
} else if (operator.equals("+")) {
resultNum += getNumberFromText();
} else if (operator.equals("-")) {
resultNum -= getNumberFromText();
} else if (operator.equals("*")) {
resultNum *= getNumberFromText();
} else if (operator.equals("sqrt")) {
resultNum = Math.sqrt(resultNum);
} else if (operator.equals("%")) {
resultNum = resultNum / 100;
} else if (operator.equals("+/-")) {
resultNum = resultNum * (-1);
} else if (operator.equals("=")) {
resultNum = getNumberFromText();
}
if (operateValidFlag) {
long t1;
double t2;
t1 = (long) resultNum;
t2 = resultNum - t1;
if (t2 == 0) {
ta.setText(String.valueOf(t1));
} else {
ta.setText(String.valueOf(resultNum));
}
}
operator = key;
flag = true;
operateValidFlag = true;
}

private double getNumberFromText() {
double result = 0;
try {
result = Double.valueOf(ta.getText()).doubleValue();
} catch (NumberFormatException e) { }
return result;
}
}

解决方案 »

  1.   

    程序有两个问题1.
    JTextArea 声明后未实例化,所以会报空指针错误

    JTextArea ta;
    改成:
    JTextArea ta=new JTextArea();2.
    originalKey 的循环下标是从0开始的,所以你里面的循环越界了将for(int i = 0;i<=originalKey.length;i++){
    key[i] = new JButton(originalKey[i]);
    keyPanel.add(key[i]);
    key[i].setForeground (Color.red);
    }for(int i = 0;i<=originalKey.length;i++){
    key[i].addActionListener(this);
    }
    改成: 
    for(int i = 0;i<originalKey.length;i++){
    key[i] = new JButton(originalKey[i]);
    keyPanel.add(key[i]);
    key[i].setForeground (Color.red);
    }for(int i = 0;i<originalKey.length;i++){
    key[i].addActionListener(this);
    }
    其实这些都是小错误,仔细一点都能发现的,要善于查看编译器的报错信息