java编辑计算器,如何使计算器能够进行计算??代码如下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DemoB extends JPanel{
private JButton[] numberButtons;
private JButton pointButton;
private JButton addButton;
private JButton subtractButton;
private JButton multiplyButton;
private JButton devidedButton;
private JButton equalButton;
private JTextField result;

private StringBuffer right = new StringBuffer();
private boolean hasPoint = false;
public DemoB(){
this.setLayout(new BorderLayout());
JPanel center = new JPanel(new GridLayout(4,4,1,1));
pointButton = new JButton(".");
pointButton.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
if(hasPoint == false){
right.append(".");
result.setText(right.toString());
hasPoint = true;
}
}
}
);

addButton = new JButton("+");
subtractButton = new JButton("-");
multiplyButton = new JButton("*");
devidedButton = new JButton("/");
equalButton = new JButton("=");

numberButtons = new JButton[10];
NumberHandler numberHandler = new NumberHandler();
for(int i = 0; i < 10; i++){
numberButtons[i] = new JButton(String.valueOf(i));
numberButtons[i].addActionListener(numberHandler);
center.add(numberButtons[i]);
}
center.add(pointButton);
center.add(equalButton);
center.add(addButton);
center.add(subtractButton);
center.add(multiplyButton);
center.add(devidedButton);

result = new JTextField();
result.setEditable(false);
result.setHorizontalAlignment(SwingConstants.RIGHT);

add(center,BorderLayout.CENTER);
add(result,BorderLayout.NORTH);
}
private class NumberHandler implements ActionListener{
public void actionPerformed(ActionEvent e){

for(int i = 0; i < numberButtons.length; i++){
if(e.getSource() == numberButtons[i]){
right.append(String.valueOf(i));
result.setText(right.toString());
break;
}
}
}
}
public static void main(String[] args){
JFrame f = new JFrame("计算器");
DemoB d = new DemoB();
f.getContentPane().add(d);
f.setResizable(false);
f.setSize(180,190);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

见下,我加了注释的地方是跟我在你源代码基础上修改了的位置。其他的没变。类名为了更有意义我改成Calculator了,你可以自己根据需要改回来。
暂时只实现了加减乘除,和连续的四则混合运算。还有点击=号计算结束后,可继续进行下次计算。
不支持点击=号后,再继续与上次的结果进行连加或连减一类的。
如果有需要的话,我还可以再帮你更新功能~

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class Calculator extends JPanel {
private JButton[] numberButtons;
private JButton pointButton;
private JButton addButton;
private JButton subtractButton;
private JButton multiplyButton;
private JButton devidedButton;
private JButton equalButton;
private JTextField result;
private List<Integer> operatorList = new ArrayList(); //保存+-*/符号的数组,1代表+,2代表-,3代表*,4代表/
private List<Integer> temp = new ArrayList(); //保存操作数

private StringBuffer right = new StringBuffer();
private boolean hasPoint = false;

public Calculator() {
this.setLayout(new BorderLayout());
JPanel center = new JPanel(new GridLayout(4, 4, 1, 1));
pointButton = new JButton(".");
pointButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (hasPoint == false) {
right.append(".");
result.setText(right.toString());
hasPoint = true;
}
}
});

addButton = new JButton("+");
subtractButton = new JButton("-");
multiplyButton = new JButton("*");
devidedButton = new JButton("/");
equalButton = new JButton("=");

numberButtons = new JButton[10];
NumberHandler numberHandler = new NumberHandler();
for (int i = 0; i < 10; i++) {
numberButtons[i] = new JButton(String.valueOf(i));
numberButtons[i].addActionListener(numberHandler);
center.add(numberButtons[i]);
}

center.add(pointButton);
center.add(equalButton);
center.add(addButton);
center.add(subtractButton);
center.add(multiplyButton);
center.add(devidedButton);

// OperateHandler该类负责处理”加减乘除“点击事件,类似NumberHandler
OperateHandler operateHandler = new OperateHandler();
addButton.addActionListener(operateHandler);
subtractButton.addActionListener(operateHandler);
multiplyButton.addActionListener(operateHandler);
devidedButton.addActionListener(operateHandler);
equalButton.addActionListener(operateHandler);

result = new JTextField();
result.setEditable(false);
result.setHorizontalAlignment(SwingConstants.RIGHT);

add(center, BorderLayout.CENTER);
add(result, BorderLayout.NORTH);
}

private class NumberHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {

for (int i = 0; i < numberButtons.length; i++) {
if (e.getSource() == numberButtons[i]) {
System.out.println(e.getSource());
right.append(String.valueOf(i));
result.setText(right.toString());
break;
}
}
}
}

// OperateHandler该类负责处理”加减乘除“点击事件,类似NumberHandler
private class OperateHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
//如果是加减乘除符号,则在operatorList里保存对应数字
if (e.getSource() == addButton) {
operatorList.add(1);
//将点击+号前输入的数字保存在temp集合里
temp.add(Integer.parseInt(right.toString()));
//将点击+号前输入的数字保存成一个string,清空StringBuffer等待接收下一个操作数
entireNumInput(right.toString());
}
//类似上面加号的逻辑
if (e.getSource() == subtractButton) {
operatorList.add(2);
temp.add(Integer.parseInt(right.toString()));
result.setText(entireNumInput(right.toString()));
}
//类似上面加号的逻辑
if (e.getSource() == multiplyButton) {
operatorList.add(3);
temp.add(Integer.parseInt(right.toString()));
result.setText(entireNumInput(right.toString()));
}
//类似上面加号的逻辑
if (e.getSource() == devidedButton) {
operatorList.add(4);
temp.add(Integer.parseInt(right.toString()));
result.setText(entireNumInput(right.toString()));
}
//如果是等号
if (e.getSource() == equalButton) {
Integer last = -1;
//首先将刚刚输入的数字存在temp集合中,等待参与计算
temp.add(Integer.parseInt(right.toString()));
//只有两个操作数做加减乘除时,运行下面的语句:调用”计算“方法,分别传入符号和两个操作数
last = calculate(operatorList.get(0), temp.get(0), temp.get(1));
//支持连加或加减乘除混合运算,当操作数大于两个时,例:12+12+25这种情况,会继续运行下面的语句,实现连续操作
for (int i = 2; i < temp.size(); i++) {
last = calculate(operatorList.get(i - 1), last, temp.get(i));
}
//计算完成后,将结果显示在屏幕上
result.setText(last.toString());
//点击完等号清空所有集合,以便进行下次计算
temp.clear();
operatorList.clear();
}
}

//将点击某加减乘除操作符前输入的数字保存成一个string,清空StringBuffer等待接收下一个操作数
private String entireNumInput(String num) {
right.delete(0, right.length());
return num;
}

//"计算"方法
private Integer calculate(Integer operation, Integer lastResult, Integer num2) {
//如果还没有进行连加等操作,即保存”刚才计算的结果“的值为初始值-1。则进行普通计算返回结果。
if (lastResult.equals(-1)) {
return num2;
}
//如果已经进行连加等操作,根据不同的操作符,执行加减乘除。操作数分别使用上次的结果,和temp集合中保存操作数。
Integer result = 0;
switch (operation) {
case 1:
result = lastResult + num2;
break;
case 2:
result = lastResult - num2;
break;
case 3:
result = lastResult * num2;
break;
case 4:
result = lastResult / num2;
break;
default:
return num2;
}
return result;
}

}

public static void main(String[] args) {
JFrame f = new JFrame("计算器");
Calculator d = new Calculator();
f.getContentPane().add(d);
f.setResizable(false);
f.setSize(180, 190);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} 追问能不用 Integer 来做么??就在原来的基础上添加计算的功能。。。。 回答为集合加Integer泛型是因为从集合中取出来的对象都是Object类型,每次取出时都要类型转换太麻烦。如果你暂时不太熟悉的话,那你就用int吧,取出来的时候自己转换一下。

Integer.parseInt(String)是一个工具方法,将String转成int的,这个是最简便的,没什么太好的替代方式,如果是老师不让用,你就跟老师说是上网查的资料吧~~呵呵 谢谢
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-28
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;

public class MyCalculator implements ActionListener{

private boolean append=false;//append表示数字状态(追加/替换)
private JTextField textField=new JTextField();

private String op1="0";
private String operator="+";
@Override
public void actionPerformed(ActionEvent e) {
String comm=e.getActionCommand();
//把数字键一网打尽
// if("0".equals(comm)||"1".equals(comm)||)
// if(comm.matches("^\\d+$"))
if("0123456789".indexOf(comm)!=-1){
if(append){//追加
String temp=textField.getText();
textField.setText(temp+comm);
}else{//替换
textField.setText(comm);
append=true;
}
}else if("+-*/".indexOf(comm)!=-1){
op1=textField.getText();
operator=comm;
append=false;
}else if("=".equals(comm)){
String op2=textField.getText();
double d1=Double.parseDouble(op1);
double d2=Double.parseDouble(op2);
if("+".equals(operator)){
d1=d1+d2;
}else if("-".equals(operator)){
d1=d1-d2;
}else if("*".equals(operator)){
d1=d1*d2;
}else{
d1=d1/d2;
}
textField.setText(d1+"");
append=false;
}else if(".".equals(comm)){
String temp=textField.getText();
if(temp.indexOf(".")==-1){//没有小数点
textField.setText(temp+".");
append=true;
}
}else if("+/-".equals(comm)){
String temp=textField.getText();
if(temp.startsWith("-")){
textField.setText(temp.substring(1));
}else{
textField.setText("-"+temp);
}
}else if("BackS".equals(comm)){
String temp=textField.getText();
if(temp.length()>0){
textField.setText(temp.substring(0,temp.length()-1));
}
}else if("CE".equals(comm)||"C".equals(comm)){
textField.setText("0");
op1="0";
append=false;
}
}
public MyCalculator(){
String[] lab={"BackS","CE","C","+",
"7","8","9","-",
"4","5","6","*",
"1","2","3","/",
"0","+/-",".","="};
JFrame frame=new JFrame("计算器");
frame.add(textField,BorderLayout.NORTH);

JPanel panel=new JPanel();
GridLayout gl=new GridLayout(5,4);
panel.setLayout(gl);

for(int i=0;i<lab.length;i++){
JButton button =new JButton(lab[i]);
button.addActionListener(this);
panel.add(button);
}
frame.add(panel,BorderLayout.CENTER);

textField.setEditable(false);//编辑框不可接受输入
frame.setResizable(false);
frame.setLocation(200,300);
// frame.setSize(420,260);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new MyCalculator();

}
}
第2个回答  2011-09-28
见下,我加了注释的地方是跟我在你源代码基础上修改了的位置。其他的没变。类名为了更有意义我改成Calculator了,你可以自己根据需要改回来。
暂时只实现了加减乘除,和连续的四则混合运算。还有点击=号计算结束后,可继续进行下次计算。
不支持点击=号后,再继续与上次的结果进行连加或连减一类的。
如果有需要的话,我还可以再帮你更新功能~

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class Calculator extends JPanel {
private JButton[] numberButtons;
private JButton pointButton;
private JButton addButton;
private JButton subtractButton;
private JButton multiplyButton;
private JButton devidedButton;
private JButton equalButton;
private JTextField result;
private List<Integer> operatorList = new ArrayList(); //保存+-*/符号的数组,1代表+,2代表-,3代表*,4代表/
private List<Integer> temp = new ArrayList(); //保存操作数

private StringBuffer right = new StringBuffer();
private boolean hasPoint = false;

public Calculator() {
this.setLayout(new BorderLayout());
JPanel center = new JPanel(new GridLayout(4, 4, 1, 1));
pointButton = new JButton(".");
pointButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (hasPoint == false) {
right.append(".");
result.setText(right.toString());
hasPoint = true;
}
}
});

addButton = new JButton("+");
subtractButton = new JButton("-");
multiplyButton = new JButton("*");
devidedButton = new JButton("/");
equalButton = new JButton("=");

numberButtons = new JButton[10];
NumberHandler numberHandler = new NumberHandler();
for (int i = 0; i < 10; i++) {
numberButtons[i] = new JButton(String.valueOf(i));
numberButtons[i].addActionListener(numberHandler);
center.add(numberButtons[i]);
}

center.add(pointButton);
center.add(equalButton);
center.add(addButton);
center.add(subtractButton);
center.add(multiplyButton);
center.add(devidedButton);

// OperateHandler该类负责处理”加减乘除“点击事件,类似NumberHandler
OperateHandler operateHandler = new OperateHandler();
addButton.addActionListener(operateHandler);
subtractButton.addActionListener(operateHandler);
multiplyButton.addActionListener(operateHandler);
devidedButton.addActionListener(operateHandler);
equalButton.addActionListener(operateHandler);

result = new JTextField();
result.setEditable(false);
result.setHorizontalAlignment(SwingConstants.RIGHT);

add(center, BorderLayout.CENTER);
add(result, BorderLayout.NORTH);
}

private class NumberHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {

for (int i = 0; i < numberButtons.length; i++) {
if (e.getSource() == numberButtons[i]) {
System.out.println(e.getSource());
right.append(String.valueOf(i));
result.setText(right.toString());
break;
}
}
}
}

// OperateHandler该类负责处理”加减乘除“点击事件,类似NumberHandler
private class OperateHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
//如果是加减乘除符号,则在operatorList里保存对应数字
if (e.getSource() == addButton) {
operatorList.add(1);
//将点击+号前输入的数字保存在temp集合里
temp.add(Integer.parseInt(right.toString()));
//将点击+号前输入的数字保存成一个string,清空StringBuffer等待接收下一个操作数
entireNumInput(right.toString());
}
//类似上面加号的逻辑
if (e.getSource() == subtractButton) {
operatorList.add(2);
temp.add(Integer.parseInt(right.toString()));
result.setText(entireNumInput(right.toString()));
}
//类似上面加号的逻辑
if (e.getSource() == multiplyButton) {
operatorList.add(3);
temp.add(Integer.parseInt(right.toString()));
result.setText(entireNumInput(right.toString()));
}
//类似上面加号的逻辑
if (e.getSource() == devidedButton) {
operatorList.add(4);
temp.add(Integer.parseInt(right.toString()));
result.setText(entireNumInput(right.toString()));
}
//如果是等号
if (e.getSource() == equalButton) {
Integer last = -1;
//首先将刚刚输入的数字存在temp集合中,等待参与计算
temp.add(Integer.parseInt(right.toString()));
//只有两个操作数做加减乘除时,运行下面的语句:调用”计算“方法,分别传入符号和两个操作数
last = calculate(operatorList.get(0), temp.get(0), temp.get(1));
//支持连加或加减乘除混合运算,当操作数大于两个时,例:12+12+25这种情况,会继续运行下面的语句,实现连续操作
for (int i = 2; i < temp.size(); i++) {
last = calculate(operatorList.get(i - 1), last, temp.get(i));
}
//计算完成后,将结果显示在屏幕上
result.setText(last.toString());
//点击完等号清空所有集合,以便进行下次计算
temp.clear();
operatorList.clear();
}
}

//将点击某加减乘除操作符前输入的数字保存成一个string,清空StringBuffer等待接收下一个操作数
private String entireNumInput(String num) {
right.delete(0, right.length());
return num;
}

//"计算"方法
private Integer calculate(Integer operation, Integer lastResult, Integer num2) {
//如果还没有进行连加等操作,即保存”刚才计算的结果“的值为初始值-1。则进行普通计算返回结果。
if (lastResult.equals(-1)) {
return num2;
}
//如果已经进行连加等操作,根据不同的操作符,执行加减乘除。操作数分别使用上次的结果,和temp集合中保存操作数。
Integer result = 0;
switch (operation) {
case 1:
result = lastResult + num2;
break;
case 2:
result = lastResult - num2;
break;
case 3:
result = lastResult * num2;
break;
case 4:
result = lastResult / num2;
break;
default:
return num2;
}
return result;
}

}

public static void main(String[] args) {
JFrame f = new JFrame("计算器");
Calculator d = new Calculator();
f.getContentPane().add(d);
f.setResizable(false);
f.setSize(180, 190);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}追问

能不用 Integer 来做么??就在原来的基础上添加计算的功能。。。。

追答

为集合加Integer泛型是因为从集合中取出来的对象都是Object类型,每次取出时都要类型转换太麻烦。如果你暂时不太熟悉的话,那你就用int吧,取出来的时候自己转换一下。

Integer.parseInt(String)是一个工具方法,将String转成int的,这个是最简便的,没什么太好的替代方式,如果是老师不让用,你就跟老师说是上网查的资料吧~~呵呵

本回答被提问者采纳