// Calculator.java // p. 673 exercise import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Calculator extends JApplet implements ActionListener { private JTextField displayField; private JButton buttons[]; private BorderLayout layout; private JPanel buttonPanel; private double sum; private double val1; private char pendingOp; private boolean newNumStart; private boolean gettingSecondNum; public void init() { String[] buttonNames = {"7","8","9","/", "4","5","6","*", "1","2","3","-", "0",".","=","+"}; layout = new BorderLayout( 5, 5 ); // 5 pixel gaps // get content pane and set its layout Container container = getContentPane(); container.setLayout( layout ); displayField = new JTextField( "", 20 ); displayField.setFont( new Font ("Courier",Font.BOLD,20) ); displayField.setEditable( false ); //actionListener container.add( displayField, BorderLayout.NORTH ); buttons = new JButton[ 16 ]; // set up panel and set its layout buttonPanel = new JPanel(); buttonPanel.setLayout( new GridLayout( 4, 4, 3, 3 ) ); // create and add buttons for ( int i = 0; i < buttons.length; i++ ) { buttons[ i ] = new JButton( buttonNames[ i ] ); buttons[i].setFont( new Font ("Courier",Font.BOLD,30) ); buttonPanel.add( buttons[ i ] ); buttons[ i ].addActionListener( this ); } toggleButton( '=', false ); //disable at start of next number toggleButton( '+', false ); //disable toggleButton( '-', false ); //disable toggleButton( '*', false ); //disable toggleButton( '/', false ); //disable container.add( buttonPanel, BorderLayout.CENTER ); newNumStart = true; gettingSecondNum = false; } // handle button events public void actionPerformed( ActionEvent event ) { char ch; ch = event.getActionCommand().charAt(0); if (Character.isDigit(ch)) { if ( newNumStart ) { displayField.setText( "" ); newNumStart = false; } //redundantly, but lets .d work if ( gettingSecondNum ) { toggleButton( '=', true ); toggleButton( '+', false ); toggleButton( '-', false ); toggleButton( '*', false ); toggleButton( '/', false ); } else { toggleButton( '+', true ); toggleButton( '-', true ); toggleButton( '*', true ); toggleButton( '/', true ); } displayField.setText(displayField.getText()+event.getActionCommand()); } else if (ch == '=') { //do current operation double val2 = Double.parseDouble(displayField.getText()); sum = val1; //change this later to allow running switch (pendingOp) { case '+' : sum += val2; break; case '-' : sum -= val2; break; case '*' : sum *= val2; break; case '/' : sum /= val2; break; default: } displayField.setText( "" + sum ); newNumStart = true; gettingSecondNum = false; toggleButton( '=', false ); //disable at start of next number toggleButton( '+', false ); //disable toggleButton( '-', false ); //disable toggleButton( '*', false ); //disable toggleButton( '/', false ); //disable toggleButton( '.', true ); //enable it } else if (ch == '.') { //check if not already decimal point toggleButton( '.', false ); //disable it if ( newNumStart ) { displayField.setText( "" ); newNumStart = false; } displayField.setText(displayField.getText() + "."); } else { //operation. pendingOp = ch; val1 = Double.parseDouble(displayField.getText()); gettingSecondNum = true; displayField.setText( "" ); newNumStart = true; toggleButton( '+', false ); //disable toggleButton( '-', false ); //disable toggleButton( '*', false ); //disable toggleButton( '/', false ); //disable toggleButton( '.', true ); //enable it } } private void toggleButton( char button, boolean enableDisable ) { //warning: index will have to change if buttons change switch (button) { case '+' : buttons[15].setEnabled(enableDisable); break; case '-' : buttons[11].setEnabled(enableDisable); break; case '*' : buttons[7].setEnabled(enableDisable); break; case '/' : buttons[3].setEnabled(enableDisable); break; case '=' : buttons[14].setEnabled(enableDisable); break; case '.' : buttons[13].setEnabled(enableDisable); break; default: } } }