import java.awt.*;
import java.awt.event.*;
import javax.swing.*;import com.MainWindow;
 class J extends JFrame{
    private TextField t_result;
    private Panel p_main;//主面板
    private Panel p_num;//数字面板
    private Panel p_show;//显示面板
    private Button b_num[];//按钮
    public JMenuBar meubar;
    public JMenu Menu;
    public JMenuItem item1;   
    public J(String title){
setTitle(title);
meubar=new JMenuBar();
Menu=new JMenu("帮助");
item1=new JMenuItem("帮助文档");
Menu.add(item1);
meubar.add(Menu);
setJMenuBar(meubar);
t_result = new TextField("0",21);
p_main = new Panel();
p_num = new Panel();
p_show = new Panel();
p_main.setLayout(new BorderLayout());
p_num.setLayout(new GridLayout(4,5,1,1));
b_num = new Button[20];
b_num[0] = new Button("1");
b_num[1] = new Button("2");
b_num[2] = new Button("3");
b_num[3] = new Button("+");
b_num[4] = new Button("-");
b_num[5] = new Button("4");
b_num[6] = new Button("5");
b_num[7] = new Button("6");
b_num[8] = new Button("*");
b_num[9] = new Button("/");
b_num[10] = new Button("7");
b_num[11] = new Button("8");
b_num[12] = new Button("9");
b_num[13] = new Button("pow");
b_num[14] = new Button("sqrt");
b_num[15] = new Button("0");
b_num[16] = new Button("CE");
b_num[17] = new Button(".");
b_num[18] = new Button("+/-");
b_num[19] = new Button("=");
for(int i = 0;i < 20;i++){
    p_num.add(b_num[i]);
}
t_result.setEditable(false);
p_show.add(t_result,BorderLayout.NORTH);  //文本框在显示面板的北边
p_main.add(p_show,BorderLayout.NORTH);  //显示面板在主面板上的北边
p_main.add(p_num,BorderLayout.WEST);  
this.add(p_main,BorderLayout.CENTER);     //主面板在框架(主窗口)的中间
setSize(500,500);
setResizable(false);
pack();                                 //           调整此窗口的大小 
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
    System.exit(0);
}
});
ButtonListener b2=new ButtonListener();
item1.addActionListener(b2);
ButtonListener bl = new ButtonListener();    //监听器对象
for(int i=0;i<20;i++){
b_num[i].addActionListener(bl);                //注册监听器
}
}
class ButtonListener implements ActionListener {              //监听器类是内部类
private String lastOp; //存储上一次操作符
private String strVal; //存储数字对应的字符串 
private double total; //总数
private double number; //存储新输入的数
private boolean firsttime;//判断是否第一次按下的是操作符按钮
private boolean operatorPressed;//判断是否已经按过操作符按钮 
ButtonListener( ){
   firsttime = true;
   strVal = "";
   
}
//事件处理器
public void actionPerformed( ActionEvent e ){
if((JMenuItem)e.getSource()==item1)
new MainWindow();

String s = ((Button)e.getSource()).getLabel().trim();
if(Character.isDigit(s.charAt(0))){    //判断是操作数还是操作符
handleNumber(s);     
}else{

    calculate(s);                                   //计算 
}

}

//判断是一元操作符还是二元操作符,并根据操作符类型做计算
void calculate( String op ){
   operatorPressed = true;
  
if(firsttime&&!isUnary(op)){
   total = getNumberOnDisplay();  
   firsttime = false;
    }         
    if (isUnary(op)){   
     handleUnaryOp(op);        
    }
    else if (lastOp != null){
handleBinaryOp(lastOp);
}
    if (!isUnary(op)){             //存储上一次按下的操作符
         lastOp = op;
    }         
}
//判断是否是一元操作符
boolean isUnary(String s){
return    s.equals( "=" )
       || s.equals( "CE" )
       || s.equals( "sqrt" ) 
       || s.equals( "+/-" )
       || s.equals( "." );        
}
//处理一元操作符
void handleUnaryOp( String op ){
if ( op.equals( "+/-" ) ){  
         //将显示框中的数字取反   
         number = negate(getNumberOnDisplay()+""); 
         t_result.setText(""); 
         t_result.setText( number + "");           
         return;        
    }else if (op.equals(".")){
         handleDecPoint();
         return;
    }else if(op.equals("sqrt")){            
     number = Math.sqrt(getNumberOnDisplay());
     t_result.setText("");
     t_result.setText(number+"");
     return;          
    }else if(op.equals("=")){
         //在按下"="前已经按下一个二元运算符
         if(lastOp!=null&&!isUnary(lastOp)){ 
              handleBinaryOp(lastOp);
         }
         lastOp=null;
         firsttime=true;
         return;
    }else{ 
       clear();
    }   
}

//处理二元运算符
void handleBinaryOp(String op){
if(op.equals("+")){ 
 total += number;
}else if(op.equals("-")){
 total -= number;
}else if(op.equals("*")){
 total *= number;
}else if(op.equals("/")){
try{                                 //异常处理
     total /=number;
}catch(ArithmeticException ae){    }
}else if(op.equals("pow"))
     total=Math.pow(total,number);
// t_result.setText("");
lastOp = null;
// strVal = "";
number = 0;     
    t_result.setText(total+"");     
}
//该方法用于处理数字按钮
void handleNumber(String s){
if (!operatorPressed){         //连接按下的数字按钮的值
strVal+=s;
}
else{                //当按下操作符按钮时,清除strVal并存储输入的第一个数值
operatorPressed = false;
strVal = s;
}
//将strVal转换为double 
number=new Double(strVal).doubleValue();
t_result.setText("");
t_result.setText(strVal);
}
//该方法用于按下"."按钮
void handleDecPoint(){
operatorPressed = false;
//如果该字符串中无".",放置一个"."在字符串末尾
if ( strVal.indexOf( "." ) < 0 ) {
     strVal+=".";
}
t_result.setText("");      
t_result.setText( strVal );
}
//该方法用于将一个数求反
double negate( String s ){
operatorPressed = false;
//如果是一个整数,去掉小数点后面的0
if ( number == ( int ) number ){
     s = s.substring(0, s.indexOf( "." ) );
 }
//如果无"-"增加在该数的前面
if ( s.indexOf( "-" ) < 0 ){
     strVal = "-"+s;
}
else{//如果有"-"则去掉
strVal = s.substring( 1 );
}   
return new Double( strVal ).doubleValue();  
}

//将显示框中的值转换为Double
double getNumberOnDisplay() {
    return new Double(t_result.getText()).doubleValue();
}
//清除屏幕并设置所有的标识
void clear(){
firsttime = true;
lastOp = null;
strVal = "";
total = 0;
number = 0;
t_result.setText("0");
}
}

    public static void main(String args[]){
J c = new J("计算器");
c.setVisible(true);
    }
问题出现在这里public void actionPerformed( ActionEvent e ){
if((JMenuItem)e.getSource()==item1){
new MainWindow();

String s = ((Button)e.getSource()).getLabel().trim();
if(Character.isDigit(s.charAt(0))){    //判断是操作数还是操作符
handleNumber(s);     
}else{

    calculate(s);                                   //计算 
}
我们老师要我们在帮助文档搞成树形的结构,我就另外调用一个文件 MainWindow,现在是如果
if((JMenuItem)e.getSource()==item1)new MainWindow();在前面,则树形文档有用但按钮操作就会没用,反之则
树形文档没用,按钮有用,纠结啊

解决方案 »

  1.   

    不能来句 else?public void actionPerformed( ActionEvent e ){
    if((JMenuItem)e.getSource()==item1){
    new MainWindow();
    } else {
    String s = ((Button)e.getSource()).getLabel().trim();
    if(Character.isDigit(s.charAt(0))){ //判断是操作数还是操作符
    handleNumber(s);    
    }else{calculate(s); //计算  
    }
    }