Public feed
#381404
import javax.swing.*;import java.awt.*;import java.awt.event.*;/* LAB 4 - CSE1030 - York University * Java Calculator by Niv Majar * March 4th, 2007 * * I tried to make this as maintainable as possible, such that * anyone not familiar with the code could easily edit it. * * As a result, I use getSource() on ActionEvent references and such. * Mostly everything but variable names can be easily changed and played around with * * If you have questions ask me in class or send me an email * nivm at yorku */public class JavaCalculator { public static void main(String[] args) { JavaCalculatorMainWindow jCalc = new JavaCalculatorMainWindow(); jCalc.setVisible(true); }}/** * A calculator window to be added to any application. * Supports addition, substraction, multiplication, and division. * @author Niv Majar * @version 0.1 * */class JavaCalculatorMainWindow extends JFrame { //Final fields public static final String DEFAULT_WINDOW_TITLE = "Java Calculator"; public static final int DEFAULT_WINDOW_WIDTH = 600; public static final int DEFAULT_WINDOW_HEIGHT = 400; //Fields to hold private classes RightPanel rightPanel; LeftPanel leftPanel; MainMenuBar mainMenu; public JavaCalculatorMainWindow() //Main constructor { super(DEFAULT_WINDOW_TITLE); createDefaultGUI(); } private void createDefaultGUI() { this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(DEFAULT_WINDOW_WIDTH,DEFAULT_WINDOW_HEIGHT); this.setLayout(new GridLayout(1,2)); //1 row, 2 columns //Add left panel to first column: leftPanel = new LeftPanel(); this.add(leftPanel); //Add right panel to second column: rightPanel = new RightPanel(); this.add(rightPanel); //Add the main menu bar mainMenu = new MainMenuBar(); this.setJMenuBar(mainMenu); } //****************************** //PRIVATE CLASSES DECLARED BELOW: //****************************** //JPanel LeftPanel class. No event handlers needed. No outside variables. //Initial purpose is to hold 3 text fields private class LeftPanel extends JPanel { private JTextField txtInputA, txtInputB, txtResultOutput; public LeftPanel() { createDefaultPanelGUI(); } private void createDefaultPanelGUI() { //3 rows, 1 column. For more textfields, add more rows. this.setLayout(new GridLayout(3,1)); //Text field A for input, size 5, at the top: txtInputA = new JTextField(5); txtInputA.setHorizontalAlignment(JTextField.CENTER); txtInputA.setFont(new Font("Arial",Font.BOLD,35)); this.add(txtInputA); //Text field B for input, size 5, at the middle: txtInputB = new JTextField(5); txtInputB.setHorizontalAlignment(JTextField.CENTER); txtInputB.setFont(new Font("Arial",Font.BOLD,35)); this.add(txtInputB); //Text field for result, size 5, at the bottom: txtResultOutput = new JTextField(5); txtResultOutput.setEditable(false); txtResultOutput.setHorizontalAlignment(JTextField.CENTER); txtResultOutput.setFont(new Font("Arial",Font.BOLD,35)); this.add(txtResultOutput); } //end createDefaultGUI method } //end LeftPanel class //JPanel RightPanel class. Handles its own events. No outside variables. //Initial purpose is to hold 4 buttons. private class RightPanel extends JPanel implements ActionListener { private JButton btnAdd, btnSub, btnDivide, btnMultiply; public RightPanel() { createDefaultPanelGUI(); registerListeners(); } private void createDefaultPanelGUI() { //4 rows, 1 column. For more buttons, add more rows. this.setLayout(new GridLayout(4,1)); //From top to bottom, add four buttons: btnAdd = new JButton("+"); btnAdd.setFont(new Font("Arial",Font.BOLD,35)); this.add(btnAdd); btnSub = new JButton("-"); btnSub.setFont(new Font("Arial",Font.BOLD,35)); this.add(btnSub); btnMultiply = new JButton("*"); btnMultiply.setFont(new Font("Arial",Font.BOLD,35)); this.add(btnMultiply); btnDivide = new JButton("/"); btnDivide.setFont(new Font("Arial",Font.BOLD,35)); this.add(btnDivide); } //end createDefaultGUI() method private void registerListeners() { btnAdd.addActionListener(this); btnSub.addActionListener(this); btnMultiply.addActionListener(this); btnDivide.addActionListener(this); } public void actionPerformed(ActionEvent e) { //Try to: Parse the data, handle events try { //Parse data: String cmd = e.getActionCommand(); Object source = e.getSource(); double input1 = Double.valueOf(JavaCalculatorMainWindow.this.leftPanel.txtInputA.getText()); double input2 = Double.valueOf(JavaCalculatorMainWindow.this.leftPanel.txtInputB.getText()); //Keep useful references from other sources: JTextField txtResultOutput = JavaCalculatorMainWindow.this.leftPanel.txtResultOutput; //Handle events: if (source == btnAdd) //Alt: cmd.equals("+") { double sum = input1 + input2; txtResultOutput.setText(Double.toString(sum)); } else if (source == btnSub) //Alt: cmd.equals("-") { double difference = input1 - input2; txtResultOutput.setText(Double.toString(difference)); } else if (source == btnMultiply) //Alt: cmd.equals("*") { double product = input1 * input2; txtResultOutput.setText(Double.toString(product)); } else if (source == btnDivide) //Alt: cmd.equals("/") { double div = input1 / input2; txtResultOutput.setText(Double.toString(div)); } } //end try block catch (Exception ex) { String errorMsg = ex.getMessage(); if (errorMsg.equals("empty String")) //One of the two text fields are empty { JOptionPane.showMessageDialog(JavaCalculatorMainWindow.this,"At least one of the two text fields is empty", "Error", JOptionPane.WARNING_MESSAGE); } else { JOptionPane.showMessageDialog(JavaCalculatorMainWindow.this,"Invalid inputs", "Error", JOptionPane.WARNING_MESSAGE); } } //end catch block } //end actionPerformed method }//end RightPanel class //JMenuBar MainMenu class. Handles its own events. No outside variables. private class MainMenuBar extends JMenuBar implements ActionListener { //Variables to be instantiated on new instance: private JMenu file; private JMenuItem clearA, clearB, clearAll, exit; public MainMenuBar() { createDefaultMenu(); registerListeners(); } private void createDefaultMenu() { //Add menu: File // --> Menu Items: Clear A, Clear B, Clear all, Exit file = new JMenu("File"); clearA = new JMenuItem("Clear A"); clearB = new JMenuItem("Clear B"); clearAll = new JMenuItem("Clear all"); exit = new JMenuItem("Exit"); file.add(clearA); file.add(clearB); file.add(clearAll); file.add(exit); this.add(file); } //end createDefaultMenu method private void registerListeners() { clearA.addActionListener(this); clearB.addActionListener(this); clearAll.addActionListener(this); exit.addActionListener(this); } public void actionPerformed(ActionEvent e) { //Parse data String cmd = e.getActionCommand(); Object source = e.getSource(); //Keep useful references from other sources: JTextField txtInputA = JavaCalculatorMainWindow.this.leftPanel.txtInputA; JTextField txtInputB = JavaCalculatorMainWindow.this.leftPanel.txtInputB; JTextField txtResultOutput = JavaCalculatorMainWindow.this.leftPanel.txtResultOutput; //Handle events: if (source == clearA) //Alt: cmd.equals("Clear A") { txtInputA.setText(""); //Clear Input field A } else if (source == clearB) //Alt: cmd.equals("Clear B") { txtInputB.setText(""); //Clear input field B } else if (source == clearAll) //Alt: cmd.equals("Clear All") { txtInputA.setText(""); //Clear all text fields txtInputB.setText(""); txtResultOutput.setText(""); } else if (source == exit) //Alt: cmd.equals("Exit") { System.exit(0); } } //end actionPerformed method } //end MainMenu class } //end JavaCalculatorMainWindow class