帮忙看看我的这个问题

pengpeng5047 2009-12-19 12:17:09
想用java实现一个计算器,其中用到了栈,我的代码如下:
Calculate.java
import java.util.*;

class Calculate {
private Stack<Character> sign = new Stack<Character>();
private ArrayList<Character> list = new ArrayList<Character>();
public void addToStack( char c ){
System.out.println("addToStack");
sign.push( c );
System.out.println("符号栈中元素个数为"+sign.size());
}
public void addToList( char c ){
System.out.println("addToList");
list.add( c );
}
public void deleteChar(){
System.out.println("deleteChar");
}
public void emptyStack(){
System.out.println("emptyStack");

}
public void emptyList(){
System.out.println("emptyList");
}
public String result(){
return "结果";
}
}

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

class UI {
private JFrame myCalculate;
private JPanel contentPanel;
private JPanel buttonPanel;
private JTextField result;
private JButton bracketLeft;
private JButton bracketRight;
private JButton num0;
private JButton num1;
private JButton num2;
private JButton num3;
private JButton num4;
private JButton num5;
private JButton num6;
private JButton num7;
private JButton num8;
private JButton num9;
private JButton add;
private JButton sub;
private JButton mul;
private JButton div;
private JButton dot;
private JButton equal;
private JButton delete;
private JButton empty;
private Listener myListener;
public UI(){
myCalculate = new JFrame("计算器");
contentPanel = new JPanel();
BorderLayout borderLayout = new BorderLayout();
borderLayout.setVgap(20);
contentPanel.setLayout(borderLayout);
myCalculate.setContentPane(contentPanel);
result = new JTextField(20);
result.setEditable(false);
bracketLeft = new JButton("(");
bracketRight = new JButton(")");
num0 = new JButton("0");
num1 = new JButton("1");
num2 = new JButton("2");
num3 = new JButton("3");
num4 = new JButton("4");
num5 = new JButton("5");
num6 = new JButton("6");
num7 = new JButton("7");
num8 = new JButton("8");
num9 = new JButton("9");
add = new JButton("+");
sub = new JButton("-");
mul = new JButton("×");
div = new JButton("÷");
dot = new JButton(".");
equal = new JButton("=");
delete = new JButton("删除");
empty = new JButton("清空");
myListener = new Listener();
bracketLeft.addActionListener(myListener);
bracketRight.addActionListener(myListener);
num0.addActionListener(myListener);
num1.addActionListener(myListener);
num2.addActionListener(myListener);
num3.addActionListener(myListener);
num4.addActionListener(myListener);
num5.addActionListener(myListener);
num6.addActionListener(myListener);
num7.addActionListener(myListener);
num8.addActionListener(myListener);
num9.addActionListener(myListener);
add.addActionListener(myListener);
sub.addActionListener(myListener);
mul.addActionListener(myListener);
div.addActionListener(myListener);
dot.addActionListener(myListener);
equal.addActionListener(myListener);
delete.addActionListener(myListener);
empty.addActionListener(myListener);
buttonPanel = new JPanel();
GridLayout gridLayout = new GridLayout(5,4);
gridLayout.setHgap(10);
gridLayout.setVgap(30);
buttonPanel.setLayout(gridLayout);
buttonPanel.add(bracketLeft);
buttonPanel.add(bracketRight);
buttonPanel.add(delete);
buttonPanel.add(empty);
buttonPanel.add(num7);
buttonPanel.add(num8);
buttonPanel.add(num9);
buttonPanel.add(div);
buttonPanel.add(num4);
buttonPanel.add(num5);
buttonPanel.add(num6);
buttonPanel.add(mul);
buttonPanel.add(num1);
buttonPanel.add(num2);
buttonPanel.add(num3);
buttonPanel.add(sub);
buttonPanel.add(equal);
buttonPanel.add(dot);
buttonPanel.add(num0);
buttonPanel.add(add);
contentPanel.add("North",result);
contentPanel.add("Center",buttonPanel);
myCalculate.setSize(300,350);
myCalculate.setVisible(true);
myCalculate.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
}
public void setString( String s ){
result.setText( s );
}
public void addString( String s ){
result.setText( result.getText() + s );
}
public void deleteChar(){
System.out.println("deleteChar");
}
}

Listener.java
import java.awt.event.*;

class Listener implements ActionListener {
private boolean isSign( char c ){
switch( c ){
case '(':
case ')':
case '+':
case '-':
case '×':
case '÷':return true;
default:return false;
}
}
private boolean isNum( char c){
if( c >= '.'&&c <= '9')
return true;
else
return false;
}
public void actionPerformed( ActionEvent e ){
Calculate myCalculate = new Calculate();
// System.out.println( e.getActionCommand() );
// Main.calculate.setString( e.getActionCommand() );
String button = e.getActionCommand();
char c = (button.toCharArray())[0];
if( isSign( c ) )
myCalculate.addToStack( c );//把符号添加到栈里
else if( isNum( c ) ){
Main.calculate.addString( button );//把操作数添加到文本框里
myCalculate.addToList( c );//把操作数添加到输出序列中
}
else if( button.equals( "删除" ) ){
Main.calculate.deleteChar();
myCalculate.deleteChar();
}
else if( button.equals( "清空" ) ){
Main.calculate.setString("");
myCalculate.emptyStack();
myCalculate.emptyList();
}
else if( c == '=' )
Main.calculate.setString( myCalculate.result() );
}
}

Main.java
public class Main{
static UI calculate;
public static void main( String[] args ){
calculate = new UI();
}
}

当我在界面中按一个运算符按键(+,-,*,/和括号)时,我想把运算符存到Calculate中定义的栈中,当我按多个运算符后,栈中应该有多个元素,可是为什么我的Calculate类中的addToStack()方法每次都输出“个数为1”呢?我看了半天没找出原因在哪里,旁观者清,请各位帮忙看看。
...全文
115 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
whpeng2110 2009-12-19
  • 打赏
  • 举报
回复
菜鸟路过,帮顶个!
pengpeng5047 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 viszl 的回复:]
Java codeclass Listenerimplements ActionListener {
Calculate myCalculate=new Calculate();//把这个Calculate对象设置为全局对象privateboolean isSign(char c ){switch( c ){case'(':case')':case'+':case'-':case'×':case'÷':returntrue;default:returnfalse;
}
}privateboolean isNum(char c){if( c>='.'&&c<='9')returntrue;elsereturnfalse;
}publicvoid actionPerformed( ActionEvent e ){// System.out.println( e.getActionCommand() );// Main.calculate.setString( e.getActionCommand() ); String button= e.getActionCommand();char c= (button.toCharArray())[0];if( isSign( c ) )
myCalculate.addToStack( c );//把符号添加到栈里elseif( isNum( c ) ){
Main.calculate.addString( button );//把操作数添加到文本框里 myCalculate.addToList( c );//把操作数添加到输出序列中 }elseif( button.equals("删除" ) ){
Main.calculate.deleteChar();
myCalculate.deleteChar();
}elseif( button.equals("清空" ) ){
Main.calculate.setString("");
myCalculate.emptyStack();
myCalculate.emptyList();
}elseif( c=='=' )
Main.calculate.setString( myCalculate.result() );
}
}
你的代码中
public void actionPerformed( ActionEvent e ){
        Calculate myCalculate = new Calculate();
...}这样写,你给事件注册句柄,每次调用这个句柄函数的时候都会new一个Calculate,改成上面那样就可以了

[/Quote]
呵呵,是这么回事,多谢了。
loveofmylife 2009-12-19
  • 打赏
  • 举报
回复
class Listener implements ActionListener {
Calculate myCalculate = new Calculate();//把这个Calculate对象设置为全局对象
private boolean isSign( char c ){
switch( c ){
case '(':
case ')':
case '+':
case '-':
case '×':
case '÷':return true;
default:return false;
}
}
private boolean isNum( char c){
if( c >= '.'&&c <= '9')
return true;
else
return false;
}
public void actionPerformed( ActionEvent e ){

// System.out.println( e.getActionCommand() );
// Main.calculate.setString( e.getActionCommand() );
String button = e.getActionCommand();
char c = (button.toCharArray())[0];
if( isSign( c ) )
myCalculate.addToStack( c );//把符号添加到栈里
else if( isNum( c ) ){
Main.calculate.addString( button );//把操作数添加到文本框里
myCalculate.addToList( c );//把操作数添加到输出序列中
}
else if( button.equals( "删除" ) ){
Main.calculate.deleteChar();
myCalculate.deleteChar();
}
else if( button.equals( "清空" ) ){
Main.calculate.setString("");
myCalculate.emptyStack();
myCalculate.emptyList();
}
else if( c == '=' )
Main.calculate.setString( myCalculate.result() );
}
}

你的代码中
public void actionPerformed( ActionEvent e ){
Calculate myCalculate = new Calculate();
...}这样写,你给事件注册句柄,每次调用这个句柄函数的时候都会new一个Calculate,改成上面那样就可以了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧