Package

Source Code of CustomABOUTDialog

/*
Name: Hemanth. B
Website: http://www.java-swing-tutorial.com

Topic: A basic Java Swing Calculator

Conventions Used in Source code
---------------------------------
  1. All JLabel components start with jlb*
  2. All JPanel components start with jpl*
  3. All JMenu components start with jmenu*
  4. All JMenuItem components start with jmenuItem*
  5. All JDialog components start with jdlg*
  6. All JButton components start with jbn*
*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;

public class Calculator extends JFrame implements ActionListener {
  // Variables
  final int MAX_INPUT_LENGTH = 20;
  final int INPUT_MODE = 0;
  final int RESULT_MODE = 1;
  final int ERROR_MODE = 2;
  int displayMode;

  boolean clearOnNextDigit, percent;
  double lastNumber;
  String lastOperator;

  private JMenu jmenuFile, jmenuHelp;
  private JMenuItem jmenuitemExit, jmenuitemAbout;

  private JLabel jlbOutput;
  private JButton jbnButtons[];
  private JPanel jplMaster, jplBackSpace, jplControl;

  /*
   * Font(String name, int style, int size) Creates a new Font from the
   * specified name, style and point size.
   */

  Font f12 = new Font("Times New Roman", 0, 12);
  Font f121 = new Font("Times New Roman", 1, 12);

  private void InitGUI(){
   
    /*
     * Set Up the JMenuBar. Have Provided All JMenu's with Mnemonics Have
     * Provided some JMenuItem components with Keyboard Accelerators
     */

    jmenuFile = new JMenu("File");
    jmenuFile.setFont(f121);
    jmenuFile.setMnemonic(KeyEvent.VK_F);

    jmenuitemExit = new JMenuItem("Exit");
    jmenuitemExit.setFont(f12);
    jmenuitemExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
        ActionEvent.CTRL_MASK));
    jmenuFile.add(jmenuitemExit);

    jmenuHelp = new JMenu("Help");
    jmenuHelp.setFont(f121);
    jmenuHelp.setMnemonic(KeyEvent.VK_H);

    jmenuitemAbout = new JMenuItem("About Calculator");
    jmenuitemAbout.setFont(f12);
    jmenuHelp.add(jmenuitemAbout);

    JMenuBar mb = new JMenuBar();
    mb.add(jmenuFile);
    mb.add(jmenuHelp);
    setJMenuBar(mb);

    // Set frame layout manager

    setBackground(Color.gray);

    jplMaster = new JPanel();

    jlbOutput = new JLabel("0");
    jlbOutput.setHorizontalTextPosition(JLabel.RIGHT);
    jlbOutput.setBackground(Color.WHITE);
    jlbOutput.setOpaque(true);
   
    // Add components to frame
    getContentPane().add(jlbOutput, BorderLayout.NORTH);

   
  }
 
  private void InitOperationalButtons(){
    jbnButtons = new JButton[23];
    // GridLayout(int rows, int cols, int hgap, int vgap)

   
    // Create numeric Jbuttons
    // set each Jbutton label to the value of index
    for (int i = 0; i <= 9; jbnButtons[i] = new JButton(String.valueOf(i++)))//Ch

    // Create operator Jbuttons
    jbnButtons[10] = new JButton("+/-");
    jbnButtons[11] = new JButton(".");
    jbnButtons[12] = new JButton("=");
    jbnButtons[13] = new JButton("/");
    jbnButtons[14] = new JButton("*");
    jbnButtons[15] = new JButton("-");
    jbnButtons[16] = new JButton("+");
    jbnButtons[17] = new JButton("sqrt");
    jbnButtons[18] = new JButton("1/x");
    jbnButtons[19] = new JButton("%");

    jplBackSpace = new JPanel();
    jplBackSpace.setLayout(new GridLayout(1, 1, 2, 2));

    jbnButtons[20] = new JButton("Backspace");
    jplBackSpace.add(jbnButtons[20]);

    jplControl = new JPanel();
    jplControl.setLayout(new GridLayout(1, 2, 2, 2));

    jbnButtons[21] = new JButton(" CE ");
    jbnButtons[22] = new JButton("C");

    jplControl.add(jbnButtons[21]);
    jplControl.add(jbnButtons[22]);

   
  }
 
  private void InitColorLocation() {
   
    JPanel jplButtons = new JPanel(); // container for Jbuttons
   
    // Setting all Numbered JButton's to Blue. The rest to Red
    for (int i = 0; i < jbnButtons.length; i++) {
      jbnButtons[i].setFont(f12);

      jbnButtons[i].setForeground((i < 10)?Color.blue:Color.red); //Ch
     
    }

    // Set panel layout manager for a 4 by 5 grid
    jplButtons.setLayout(new GridLayout(4, 5, 2, 2));

    // Add buttons to keypad panel starting at top left
    // First row
    for (int i = 7; i <= 9; jplButtons.add(jbnButtons[i++]));

    // add button / and sqrt
    jplButtons.add(jbnButtons[13]);
    jplButtons.add(jbnButtons[17]);

    // Second row
    for (int i = 4; i <= 6; i++) {
      jplButtons.add(jbnButtons[i]);
    }

    // add button * and x^2
    jplButtons.add(jbnButtons[14]);
    jplButtons.add(jbnButtons[18]);

    // Third row
    for (int i = 1; i <= 3; i++) {
      jplButtons.add(jbnButtons[i]);
    }

    // adds button - and %
    jplButtons.add(jbnButtons[15]);
    jplButtons.add(jbnButtons[19]);

    // Fourth Row
    // add 0, +/-, ., +, and =
    jplButtons.add(jbnButtons[0]);
    jplButtons.add(jbnButtons[10]);
    jplButtons.add(jbnButtons[11]);
    jplButtons.add(jbnButtons[16]);
    jplButtons.add(jbnButtons[12]);


    jplMaster.setLayout(new BorderLayout());
    jplMaster.add(jplBackSpace, BorderLayout.WEST);
    jplMaster.add(jplControl, BorderLayout.EAST);
    jplMaster.add(jplButtons, BorderLayout.SOUTH);
   
   
  }
 
  // Constructor
  public Calculator() {
   
    InitGUI();
    InitOperationalButtons();
    InitColorLocation();
   
   

    // Add components to frame
    getContentPane().add(jplMaster, BorderLayout.SOUTH);
    requestFocus();

    // activate ActionListener
    for (int i = 0; i < jbnButtons.length; jbnButtons[i++].addActionListener(this)); //Ch

    jmenuitemAbout.addActionListener(this);
    jmenuitemExit.addActionListener(this);

    clearAll();

    // add WindowListener for closing frame and ending program
    addWindowListener(new WindowAdapter() {

      public void windowClosed(WindowEvent e) {
        System.exit(0);
      }
    });
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  } // End of Contructor Calculator

  // Perform action
  public void actionPerformed(ActionEvent e) {
    double result = 0;

    if (e.getSource() == jmenuitemAbout) {
      JDialog dlgAbout = new CustomABOUTDialog(this,
          "About Java Swing Calculator", true);
      dlgAbout.setVisible(true);
    } else if (e.getSource() == jmenuitemExit) {
      System.exit(0);
    }

    // Search for the button pressed until end of array or key found
    for (int i = 0; i < jbnButtons.length; i++) {
     
      if (e.getSource() == jbnButtons[i]) {
        if(i<10) {
          addDigitToDisplay(i);
          return;
        }
        // these buttons do nothing in ERROR_MODE
        if(i>16 && i<21 && displayMode == ERROR_MODE) return;
        switch (i) {
       

        case 12: // =
          processEquals();
          break;

        case 13: // divide
          processOperator("/");
          break;

        case 14: // *
          processOperator("*");
          break;

        case 15: // -
          processOperator("-");
          break;

        case 16: // +
          processOperator("+");
          break;

        case 17: // sqrt
         
          try {
            if (getDisplayString().indexOf("-") == 0)
              displayError("Invalid input for function!");

            result = Math.sqrt(getNumberInDisplay());
            displayResult(result);
          }

          catch (Exception ex) {
            displayError("Invalid input for function!");
            displayMode = ERROR_MODE;
          }
         
          break;

        case 18: // 1/x
         
          try {
            if (getNumberInDisplay() == 0)
              displayError("Cannot divide by zero!");

            result = 1 / getNumberInDisplay();
            displayResult(result);
          }

          catch (Exception ex) {
            displayError("Cannot divide by zero!");
            displayMode = ERROR_MODE;
          }
         
          break;

        case 19: // %
         
          try {
            result = getNumberInDisplay() / 100;
            displayResult(result);
          }

          catch (Exception ex) {
            displayError("Invalid input for function!");
            displayMode = ERROR_MODE;
          }
         
          break;

        case 20: // backspace
         
          setDisplayString(getDisplayString().substring(0,
              getDisplayString().length() - 1));

          if (getDisplayString().length() < 1)
            setDisplayString("0");
         
          break;

        case 21: // CE
          clearExisting();
          break;

        case 22: // C
          clearAll();
          break;
        }
      }
    }
  }

  void setDisplayString(String s) {
    jlbOutput.setText(s);
  }

  String getDisplayString() {
    return jlbOutput.getText();
  }

  void addDigitToDisplay(int digit) {
    if (clearOnNextDigit)
      setDisplayString("");

    String inputString = getDisplayString();

    if (inputString.indexOf("0") == 0) {
      inputString = inputString.substring(1);
    }

    if ((!inputString.equals("0") || digit > 0)
        && inputString.length() < MAX_INPUT_LENGTH) {
      setDisplayString(inputString + digit);
    }

    displayMode = INPUT_MODE;
    clearOnNextDigit = false;
  }

  void addDecimalPoint() {
    displayMode = INPUT_MODE;

    if (clearOnNextDigit)
      setDisplayString("");

    String inputString = getDisplayString();

    // If the input string already contains a decimal point, don't
    // do anything to it.
    if (inputString.indexOf(".") < 0)
      setDisplayString(new String(inputString + "."));
  }

  void processSignChange() {
    if (displayMode == INPUT_MODE) {
      String input = getDisplayString();

      if (input.length() > 0 && !input.equals("0")) {
        if (input.indexOf("-") == 0) {
          setDisplayString(input.substring(1));
        } else {
          setDisplayString("-" + input);
        }
      }

    }

    else if (displayMode == RESULT_MODE) {
      double numberInDisplay = getNumberInDisplay();

      if (numberInDisplay != 0)
        displayResult(-numberInDisplay);
    }
  }

  void clearAll() {
    setDisplayString("0");
    lastOperator = "0";
    lastNumber = 0;
    displayMode = INPUT_MODE;
    clearOnNextDigit = true;
  }

  void clearExisting() {
    setDisplayString("0");
    clearOnNextDigit = true;
    displayMode = INPUT_MODE;
  }

  double getNumberInDisplay() {
    String input = jlbOutput.getText();
    return Double.parseDouble(input);
  }

  void processOperator(String op) {
    if (displayMode != ERROR_MODE) {
      double numberInDisplay = getNumberInDisplay();

      if (!lastOperator.equals("0")) {
        try {
          double result = processLastOperator();
          displayResult(result);
          lastNumber = result;
        }

        catch (DivideByZeroException e) {
        }
      }

      else {
        lastNumber = numberInDisplay;
      }

      clearOnNextDigit = true;
      lastOperator = op;
    }
  }

  void processEquals() {
    double result = 0;

    if (displayMode != ERROR_MODE) {
      try {
        result = processLastOperator();
        displayResult(result);
      }

      catch (DivideByZeroException e) {
        displayError("Cannot divide by zero!");
      }

      lastOperator = "0";
    }
  }

  double processLastOperator() throws DivideByZeroException {
    double result = 0;
    double numberInDisplay = getNumberInDisplay();

    if (lastOperator.equals("/")) {
      if (numberInDisplay == 0)
        throw (new DivideByZeroException());

      result = lastNumber / numberInDisplay;
    }

    if (lastOperator.equals("*"))
      result = lastNumber * numberInDisplay;

    if (lastOperator.equals("-"))
      result = lastNumber - numberInDisplay;

    if (lastOperator.equals("+"))
      result = lastNumber + numberInDisplay;

    return result;
  }

  void displayResult(double result) {
    setDisplayString(Double.toString(result));
    lastNumber = result;
    displayMode = RESULT_MODE;
    clearOnNextDigit = true;
  }

  void displayError(String errorMessage) {
    setDisplayString(errorMessage);
    lastNumber = 0;
    displayMode = ERROR_MODE;
    clearOnNextDigit = true;
  }

  public static void main(String args[]) {
    Calculator calci = new Calculator();
    Container contentPane = calci.getContentPane();
    // contentPane.setLayout(new BorderLayout());
    calci.setTitle("Java Swing Calculator");
    calci.setSize(241, 217);
    calci.pack();
    calci.setLocation(400, 250);
    calci.setVisible(true);
    calci.setResizable(false);
  }

} // End of Swing Calculator Class.

class DivideByZeroException extends Exception {
  public DivideByZeroException() {
    super();
  }

  public DivideByZeroException(String s) {
    super(s);
  }
}

class CustomABOUTDialog extends JDialog implements ActionListener {
  JButton jbnOk;

  CustomABOUTDialog(JFrame parent, String title, boolean modal) {
    super(parent, title, modal);
    setBackground(Color.black);

    JPanel p1 = new JPanel(new FlowLayout(FlowLayout.CENTER));

    StringBuffer text = new StringBuffer();
    text.append("Calculator Information\n\n");
    text.append("Developer:  Hemanth\n");
    text.append("Version:  1.0");

    JTextArea jtAreaAbout = new JTextArea(5, 21);
    jtAreaAbout.setText(text.toString());
    jtAreaAbout.setFont(new Font("Times New Roman", 1, 13));
    jtAreaAbout.setEditable(false);

    p1.add(jtAreaAbout);
    p1.setBackground(Color.red);
    getContentPane().add(p1, BorderLayout.CENTER);

    JPanel p2 = new JPanel(new FlowLayout(FlowLayout.CENTER));
    jbnOk = new JButton(" OK ");
    jbnOk.addActionListener(this);

    p2.add(jbnOk);
    getContentPane().add(p2, BorderLayout.SOUTH);

    setLocation(408, 270);
    setResizable(false);

    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        Window aboutDialog = e.getWindow();
        aboutDialog.dispose();
      }
    });

    pack();
  }

  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == jbnOk) this.dispose();//Ch
  }

}
TOP

Related Classes of CustomABOUTDialog

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.