如何设计一个计算器(只实现四则运算)的事件驱动?

解决方案 »

  1.   

    这是我今天在CSDN上看到的一位兄弟写的。我改了点。借花献佛了。
      

  2.   

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;public class Calculator
    {
    public static void main(String[] args)
    {
    CalculatorFrame frame = new CalculatorFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }
    }/**
     * A frame with a calculator panel
     */
    class CalculatorFrame extends JFrame
    {
    public CalculatorFrame()
    {
    setTitle("Calculator");
    Container contentPane = getContentPane();
    CalculatorPanel panel = new CalculatorPanel();
    contentPane.add(panel);
    pack();
    }
    }/**
     * A panel with buttons and a result display
     */
    class CalculatorPanel extends JPanel
    {
    public CalculatorPanel()
    {
    setLayout(new BorderLayout());
    result = 0;
    lastCommand = "=";
    start = true;
    // add the display
    display = new JLabel("0");
    add(display, BorderLayout.NORTH);
    ActionListener insert = new InsertAction();
    ActionListener command = new CommandAction();
    // add the buttons in 4X4 grid
    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);
    } /**
     * adds a button to the center panel.
     * 
     * @param label
     *            the button label
     * @param listener
     *            the button listener
     */
    private void addButton(String label, ActionListener listener)
    {
    JButton button = new JButton(label);
    button.addActionListener(listener);
    panel.add(button);
    } /**
     * This action inserts the button action string to the end of the display
     * text.
     */
    private class InsertAction implements ActionListener
    {
    public void actionPerformed(ActionEvent event)
    {
    String input = event.getActionCommand();
    if (start)
    {
    display.setText("");
    start = false;
    }
    display.setText(display.getText() + input);
    }
    } /**
     * This action executes the command that the button action string denotes.
     */
    private class CommandAction implements ActionListener
    {
    public void actionPerformed(ActionEvent evt)
    {
    String command = evt.getActionCommand();
    if (start)
    {
    if (command.equals("-"))
    {
    display.setText(command);
    start = false;
    } else
    lastCommand = command;
    } else
    {
    calculate(Double.parseDouble(display.getText()));
    lastCommand = command;
    start = true;
    }
    }
    } /**
     * Carries out the pending calculation.
     * 
     * @param x
     *            the value to be accumulated with the prior result.
     */
    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;
    else if (lastCommand.equals("="))
    result = x;
    display.setText("" + result);
    } private JLabel display; private JPanel panel; private double result; private String lastCommand; private boolean start;
    }