private class CommandAction implements ActionListener{ public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(start){
if(command.equals("-")){
display.setText(command);
start = false;

}else
lastCommand = command;

}else{
calculate(Double.parseDouble(display.getText()));
lastCommand = command;
start = true;
}
}

}

解决方案 »

  1.   

    全部代码在这里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;
    public class Calculator {
    public static void main(String[] args) {
    CalculatorFrame frame = new CalculatorFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setResizable(true);

    }}class CalculatorFrame extends JFrame{
    public CalculatorFrame(){
    // this.setSize(arg0);
    setTitle("超哥计算器");
    CalculatorPanel panel = new CalculatorPanel();
    add(panel);
    pack();
    }
    }class CalculatorPanel extends JPanel{
    public CalculatorPanel(){
    setLayout(new BorderLayout());

    result = 0;
    lastCommand = "=";
    start = true;

    display = new JButton("0");
    display.setEnabled(false);
    add(display,BorderLayout.NORTH);

    ActionListener insert = new InsertAction();
    ActionListener command = new CommandAction();

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

    addButton("7",insert);
    addButton("8",insert);
    addButton("9",insert);
    addButton("/", command);

    addButton("4",insert);
    addButton("5",insert);
    addButton("6",insert);
    addButton("*", command);

    addButton("1",insert);
    addButton("2",insert);
    addButton("3",insert);
    addButton("+", command);

    addButton("0", insert);
    addButton(".", insert);
    addButton("=", command);
    addButton("-", command);

    add(panel,BorderLayout.CENTER);
    }

    private void addButton(String  label,ActionListener listener){
    JButton button = new JButton(label);
    button.addActionListener(listener);
    panel.add(button);
    }
    private class InsertAction implements ActionListener{ public void actionPerformed(ActionEvent e) {
    String input = e.getActionCommand();
    if(start){
    display.setText("");
    start = false;
    }
    display.setText(display.getText() + input);
    }

    }

    private class CommandAction implements ActionListener{ public void actionPerformed(ActionEvent e) {
    String command = e.getActionCommand();
    if(start){
    if(command.equals("-")){
    display.setText(command);
    start = false;

    }else
    lastCommand = command;

    }else{
    calculate(Double.parseDouble(display.getText()));
    lastCommand = command;
    start = true;
    }
    }

    }


    public void calculate(double x){
    if(lastCommand.equals("+"))  result += x;
    else if(lastCommand.equals("-"))  result -= x;
    else if(lastCommand.equals("*"))  result *= x;
    else if(lastCommand.equals("/"))  result /= x;
    display.setText(" " + result);
    }

    private JButton display;
    private JPanel panel;
    private boolean start;
    private double result;
    private String lastCommand;
    }
      

  2.   

    java core 上面的例子  但是我不能完全理解那两个监听器
      

  3.   

    CommandAction ==>对应+-*/ =
    InsertAction==>对应数字
      

  4.   

    按你写的程序解读出来, 可以告诉你 你这个程序有问题.
    我下面给红色表的是两个监听器,与问题 有一些无用代码,我给你个程序思路。
    strart=true  or false 有意思么  点击按钮了 ,就会触发事件了
    还有以下这块代码  有意思么 ,点按钮,就触发事件,把符号赋值给字符串不就完了么。用判断么.
     我有说的不对可以指出来.
    共同学习,进步么
        if(start){//如果没有start是true的话进入 条件循环   这里判断的是否点击是符号键
                
                    if(command.equals("-")){//判断你是否点的是‘-’号
                     System.out.println("进入了减号");
                        display.setText(command);
                        start = false;
                        
                }else//如果不是'-'号
                    lastCommand = command;//把该符号赋值 给lastCommand
                
            }else{//如果不是点击是符号键 的话进入
                    calculate(Double.parseDouble(display.getText()));
                    lastCommand = command;
                    start = true;
                }
    源代码:
    package test;
    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;
    public class test {
        public static void main(String[] args) {
          CalculatorFrame frame = new CalculatorFrame();
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);
             frame.setResizable(true);    }}class CalculatorFrame extends JFrame{
        public CalculatorFrame(){
        //    this.setSize(arg0);
            setTitle("超哥计算器");
            CalculatorPanel panel = new CalculatorPanel();
            add(panel);//把组件添加容器上
            pack();
        }
    }class CalculatorPanel extends JPanel{
        
        private JButton display;
        private JPanel panel;
        private boolean start;
        private double result;
        private String lastCommand;
        public CalculatorPanel(){
            setLayout(new BorderLayout());
            
            result = 0;
            lastCommand = "=";
            start = true;//strart初始化
            
            display = new JButton("0");
            display.setEnabled(false);
            add(display,BorderLayout.NORTH);
            
            ActionListener insert = new InsertAction();
            ActionListener command = new CommandAction();
            
            panel = new JPanel();
            panel.setLayout(new GridLayout(4,4));
            
            addButton("7",insert);
            addButton("8",insert);
            addButton("9",insert);
            addButton("/", command);
            
            addButton("4",insert);
            addButton("5",insert);
            addButton("6",insert);
            addButton("*", command);
            
            addButton("1",insert);
            addButton("2",insert);
            addButton("3",insert);
            addButton("+", command);
            
            addButton("0", insert);
            addButton(".", insert);
            addButton("=", command);
            addButton("-", command);
            
            add(panel,BorderLayout.CENTER);
        }
        
        private void addButton(String  label,ActionListener listener){
            JButton button = new JButton(label);
            button.addActionListener(listener);
            panel.add(button);
        }    
        private class InsertAction implements ActionListener{//数字键 和点键 点击事件        public void actionPerformed(ActionEvent e) {
                String input = e.getActionCommand();
                if(start){//如果没有start是true的话进入 条件循环   这里判断的是否是按了数字键和点键 
                    display.setText("");//你这个按钮的值清空
                    start = false;
                }
                display.setText(display.getText() + input);
            }
            
        }
        
        private class CommandAction implements ActionListener{//符号的事件        public void actionPerformed(ActionEvent e) {
                String command = e.getActionCommand();
                if(start){//如果没有start是true的话进入 条件循环   这里判断的是否点击是符号键
                
                    if(command.equals("-")){//判断你是否点的是‘-’号
                     System.out.println("进入了减号");
                        display.setText(command);
                        start = false;
                        
                }else//如果不是'-'号
                    lastCommand = command;//把该符号赋值 给lastCommand
                
            }else{//如果不是点击是符号键 的话进入
                    calculate(Double.parseDouble(display.getText()));
                    lastCommand = command;
                    start = true;
                }
            }
            
        }
        
        

        public void calculate(double x){//判断运算符号
            if(lastCommand.equals("+"))  result += x;
            else if(lastCommand.equals("-"))  result -= x;
            else if(lastCommand.equals("*"))  result *= x;
            else if(lastCommand.equals("/"))  result /= x;
            display.setText(" " + result);
        }}
      

  5.   

    <Core Java I>中这段计算器代码我看过,是在讲Swing的组建布局里的实例代码,两种类型的ActionListener分别侦听数字按钮和运算符按钮。
      

  6.   

    “Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "-"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)
    at java.lang.Double.parseDouble(Double.java:510)
    at CalculatorPanel$CommandAction.actionPerformed(Calculator.java:108)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6216)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
    at java.awt.Component.processEvent(Component.java:5981)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4583)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4413)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2475)
    at java.awt.Component.dispatchEvent(Component.java:4413)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
    Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "-"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)
    at java.lang.Double.parseDouble(Double.java:510)
    at CalculatorPanel$CommandAction.actionPerformed(Calculator.java:108)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6216)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
    at java.awt.Component.processEvent(Component.java:5981)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4583)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4413)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2475)
    at java.awt.Component.dispatchEvent(Component.java:4413)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

    直接性无言