// 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);
}
}
}