// DO NOT edit this file // DO NOT submit this file package proj2; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.SpinnerNumberModel; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; /** * * The GUI for the Snack Machine project. * *
* This class is provided for you — you must not change it. *
* * @author Dennis Frey (10/7/2008) * @author Susan M. Mitchell (10/19/2010) * @author Daniel J. Hood (3/6/2011) * * @version 3/6/2011 * */ public class Project2 { private static final String APP_NAME = "CMSC 202 Project 2"; private SnackMachine snackMachine; private JSpinner nickelSpinner, dimeSpinner, quarterSpinner; private JFrame mainFrame; /** * The entry point for this assignment * * @param args no command line arguments. */ public static void main (String [] args) { try { System.setProperty("apple.laf.useScreenMenuBar", "true"); System.setProperty("com.apple.mrj.application.apple.menu.about.name", APP_NAME); UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { } new Project2(); } /** * The sole constructor for the Project2 class. * Creates an instance of the GUI and runs it. */ public Project2() { snackMachine = new SnackMachine(); mainFrame = getMainFrame(); // add menu bar to frame mainFrame.setJMenuBar(getMenuBar()); // populate the main frame mainFrame.add(getMarqueePanel(), BorderLayout.NORTH); mainFrame.add(getButtonsPanel(), BorderLayout.CENTER); mainFrame.add(getChangePanel(), BorderLayout.SOUTH); mainFrame.setVisible(true); } private JPanel getMarqueePanel() { // create and initialize panel JPanel marqueePanel = new JPanel(new BorderLayout()); marqueePanel.setBorder(new EmptyBorder(10, 10, 10, 10)); // create and initialize label JLabel marqueeLabel = new JLabel("Programmer\u2019s Late Night Snack Machine"); marqueeLabel.setBackground(Color.RED); marqueeLabel.setOpaque(true); marqueeLabel.setFont(new Font("Sans", Font.BOLD, 24)); marqueeLabel.setForeground(Color.WHITE); marqueeLabel.setHorizontalAlignment(JTextField.CENTER); Border paddingBorder = BorderFactory.createEmptyBorder(10,10,10,10); Border border = BorderFactory.createLineBorder(Color.RED.darker(), 4); marqueeLabel.setBorder(BorderFactory.createCompoundBorder(border, paddingBorder)); // add label to panel marqueePanel.add(marqueeLabel); return marqueePanel; } private JMenuBar getMenuBar() { // Maintenance Menus JMenuBar mainMenu = new JMenuBar(); // Create the Candy Maintenance Menu System JMenu candyMenu = new JMenu("Snack Maintenance"); JMenuItem addChocChipCookiesItem = new JMenuItem("Add Chocolate Chip Cookies"); JMenuItem addOatmealCookiesItem = new JMenuItem("Add Oatmeal Cookies"); JMenuItem addLemonCookiesItem = new JMenuItem("Add Lemon Cookies"); JMenuItem addMintsItem = new JMenuItem("Add Mints"); JMenuItem numberMintsItem = new JMenuItem("Mint Packages Count"); JMenuItem numberCookiesItem = new JMenuItem("Cookie Packages Count"); // attach action listeners for each menu choice addChocChipCookiesItem.addActionListener(new AddChocChipCookiesListener()); addOatmealCookiesItem.addActionListener(new AddOatmealCookiesListener()); addLemonCookiesItem.addActionListener(new AddLemonCookiesListener()); addMintsItem.addActionListener(new AddMintsListener()); numberMintsItem.addActionListener(new NumberMintsListener()); numberCookiesItem.addActionListener(new NumberCookiesListener()); // add menu items to CandyMaintenance Menu candyMenu.add(addChocChipCookiesItem); candyMenu.add(addOatmealCookiesItem); candyMenu.add(addLemonCookiesItem); candyMenu.addSeparator(); candyMenu.add(addMintsItem); candyMenu.addSeparator(); candyMenu.add(numberMintsItem); candyMenu.add(numberCookiesItem); // Register Maintenance Menu JMenu registerMenu = new JMenu("Change Drawer Maintenance"); JMenuItem changeDrawerTotalItem = new JMenuItem("Report Change Drawer Total"); // add action listeners for menu items changeDrawerTotalItem.addActionListener(new ChangeDrawerTotalListener()); registerMenu.add(changeDrawerTotalItem); // add menu lists to menu bar mainMenu.add(candyMenu); mainMenu.add(registerMenu); return mainMenu; } private JPanel getButtonsPanel() { // Buttons for purchases in the CENTER of the frame JPanel buttonsPanel = new JPanel(); buttonsPanel.setLayout(new GridLayout(1, 2, 10, 0)); buttonsPanel.setBorder(new EmptyBorder(0, 10, 0, 10)); Font buttonsFont = new Font("Sans Serif", Font.BOLD, 36); JButton mintsButton = new JButton("
Buy Mints
35¢
"); mintsButton.setFont(buttonsFont); mintsButton.addActionListener(new BuyMints()); JButton cookiesButton = new JButton("
Buy Cookies
65¢
"); cookiesButton.setFont(buttonsFont); cookiesButton.addActionListener(new BuyCookies()); buttonsPanel.add(mintsButton); buttonsPanel.add(cookiesButton); return buttonsPanel; } private JFrame getMainFrame() { JFrame frame = new JFrame(APP_NAME); frame.setLayout(new BorderLayout()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(640, 480); frame.setLocation(100, 50); return frame; } private JPanel getChangePanel() { // to encapsulate labels and spinners JPanel coinsPanel = new JPanel(); coinsPanel.setBorder(new EmptyBorder(10, 10, 10, 10)); JPanel enterChangePanel = new JPanel(); enterChangePanel.setBorder(BorderFactory.createTitledBorder(" Enter Change ")); coinsPanel.add(enterChangePanel); nickelSpinner = new JSpinner(new SpinnerNumberModel(0, 0, 20, 1)); dimeSpinner = new JSpinner(new SpinnerNumberModel(0, 0, 20, 1)); quarterSpinner = new JSpinner(new SpinnerNumberModel(0, 0, 20, 1)); enterChangePanel.add(new JLabel("Nickels:")); enterChangePanel.add(nickelSpinner); JLabel dimesLabel = new JLabel("Dimes:"); dimesLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); enterChangePanel.add(dimesLabel); enterChangePanel.add(dimeSpinner); JLabel quatersLabel = new JLabel("Quarters:"); dimesLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); enterChangePanel.add(quatersLabel); enterChangePanel.add(quarterSpinner); return coinsPanel; } // -- helper methods private void resetSpinners() { nickelSpinner.setValue(0); dimeSpinner.setValue(0); quarterSpinner.setValue(0); } //---- event handlers --- // // Buy Mints Button private class BuyMints implements ActionListener { public void actionPerformed(ActionEvent ae) { // read the coins inserted int nickels, dimes, quarters; nickels = (Integer)nickelSpinner.getValue(); dimes = (Integer)dimeSpinner.getValue(); quarters = (Integer)quarterSpinner.getValue(); // buy the Mints, get Mints in return Mints m = snackMachine.buyMints(new Money(nickels, dimes, quarters)); // sold out or not exact change if (m == null) { JOptionPane.showMessageDialog(mainFrame, "Mints purchase failed", "Error", JOptionPane.ERROR_MESSAGE); // purchase successful } else { RoundIcon mints = new RoundIcon(m.getColor(), 100); JOptionPane.showMessageDialog(mainFrame, "Congratulation! You bought this package of Mints", "Mints Purchase", JOptionPane.INFORMATION_MESSAGE, mints); } // reset coin spinners resetSpinners(); } } // Buy Cookies Button private class BuyCookies implements ActionListener { public void actionPerformed(ActionEvent ae) { // read the coins inserted int nickels, dimes, quarters; nickels = (Integer)nickelSpinner.getValue(); dimes = (Integer)dimeSpinner.getValue(); quarters = (Integer)quarterSpinner.getValue(); // buy the Cookies, get Cookies in return Cookies c = snackMachine.buyCookies(new Money(nickels, dimes, quarters)); // purchase failed if (c == null) { JOptionPane.showMessageDialog(mainFrame, "Cookies purchase failed", "Error", JOptionPane.ERROR_MESSAGE); } else { // purchase successful String msg = "Congratulations! You bought a package of " + c.getFlavor() + " cookies."; JOptionPane.showMessageDialog(mainFrame, msg, "Cookies Purchase", JOptionPane.INFORMATION_MESSAGE); } // reset coin spinners resetSpinners(); } } // Candy Maintenance Menu -- add chocolate chip cookies private class AddChocChipCookiesListener implements ActionListener { public void actionPerformed(ActionEvent ae) { AddCookies(CookieFlavors.CHOCOLATE_CHIP); } } // Candy Maintenance Menu -- add oatmeal cookies private class AddOatmealCookiesListener implements ActionListener { public void actionPerformed(ActionEvent ae) { AddCookies(CookieFlavors.OATMEAL); } } // Candy Maintenance Menu -- add lemon cookies private class AddLemonCookiesListener implements ActionListener { public void actionPerformed(ActionEvent ae) { AddCookies(CookieFlavors.LEMON); } } // common method for adding candy bars with or w/o nuts // some stuff marked "final" so they can be used within anonymous ActionListener private void AddCookies(final CookieFlavors flavor) { // pop a frame and ask how many final JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); final JSpinner cookiesSpinner = new JSpinner(new SpinnerNumberModel(1, 1, 100, 1)); JButton ok = new JButton("OK"); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { int numberCookies = (Integer)cookiesSpinner.getValue(); boolean success = snackMachine.addCookies(flavor, numberCookies); if(success) { JOptionPane.showMessageDialog(frame, numberCookies + " bags of " + flavor + " cookies have been added to the machine"); } else { JOptionPane.showMessageDialog(mainFrame, "Add cookies failed", "Error", JOptionPane.ERROR_MESSAGE); } } }); JPanel subPanel1 = new JPanel(); subPanel1.add(new JLabel("Enter Number of Bags of " + flavor + " Cookies to Add")); subPanel1.add(cookiesSpinner); JPanel subPanel2 = new JPanel(); subPanel2.add(ok); JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(subPanel1, BorderLayout.NORTH); panel.add(subPanel2, BorderLayout.CENTER); frame.add(panel, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } // Candy Maintenance Menu -- add mints private class AddMintsListener implements ActionListener { public void actionPerformed(ActionEvent ae) { // pop a frame and ask how many final JFrame frame = new JFrame(); frame.setResizable(false); frame.setLocation(200, 200); frame.setSize(500, 500); frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); // color chooser JPanel subPanel1 = new JPanel(); JLabel jlCount = new JLabel("Enter Number of Packages of Mints to Add"); SpinnerNumberModel spnmNrMints = new SpinnerNumberModel(1, 1, 100, 1); final JSpinner spinNrMints = new JSpinner(spnmNrMints); subPanel1.add(jlCount); subPanel1.add(spinNrMints); JPanel subPanel2 = new JPanel(); JLabel jlColor = new JLabel("Choose the color of the mints:"); final JColorChooser jccMintsColor = new JColorChooser(); subPanel2.add(jlColor); subPanel2.add(jccMintsColor); JPanel subPanel3 = new JPanel(); JButton ok = new JButton("OK"); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { int numberMints = (Integer)spinNrMints.getValue(); Color color = jccMintsColor.getColor(); boolean success = snackMachine.addMints(color, numberMints); if(success) { JOptionPane.showMessageDialog(frame, numberMints + " packages of mints added to the machine", "Mints Added", JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(mainFrame, "Add mints failed", "Error", JOptionPane.ERROR_MESSAGE); } } }); subPanel3.add(ok); JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(subPanel1, BorderLayout.NORTH ); panel.add(subPanel2, BorderLayout.CENTER); panel.add(subPanel3, BorderLayout.SOUTH); panel.setBackground(Color.MAGENTA); frame.add(panel, BorderLayout.CENTER); frame.setVisible(true); } } // Candy Maintenance Menu -- how many packages of mints in the machine? private class NumberMintsListener implements ActionListener { public void actionPerformed(ActionEvent ae) { // create a frame to display the number of packages of mints int numberMints = snackMachine.getNumberMints(); String info = "The snack machine currently contains " + numberMints + " packages of mints"; JOptionPane.showMessageDialog(mainFrame, info, "Number Mints", JOptionPane.INFORMATION_MESSAGE); } } // Candy Maintenance Menu -- how many bags of cookies in the machine? private class NumberCookiesListener implements ActionListener { public void actionPerformed(ActionEvent ae) { // create a frame to display the number of candy bars int numberCookies = snackMachine.getNumberCookies(); String info = "The snack machine currently contains " + numberCookies + " packages of cookies"; JOptionPane.showMessageDialog(mainFrame, info, "Number Cookies", JOptionPane.INFORMATION_MESSAGE); } } // Cash Maintenance Menu -- report cash on hand private class ChangeDrawerTotalListener implements ActionListener { public void actionPerformed(ActionEvent ae) { // call snack machine method // report coins in machine -- share with RemoveFunds Money totalMoney = snackMachine.getTotalMoney(); String info = "The Change Drawer contains " + totalMoney; JOptionPane.showMessageDialog(mainFrame, info, "Change Drawer Total", JOptionPane.INFORMATION_MESSAGE); } } /** * a round Icon with transparent corners * Used to draw Mints */ private static class RoundIcon implements Icon { private Color color; private int diameter; public RoundIcon(Color color, int diameter) { this.color = color; this.diameter = diameter; } public int getIconHeight() { return diameter; } public int getIconWidth() { return diameter; } public void paintIcon(Component c, Graphics g, int x, int y) { g.setColor(color); g.fillArc(x, y, diameter, diameter, 0, 360); } } }