//====================================================================== // PROJECT: _programming.java_ // FILE: SodaPop.java // PURPOSE: Chapter 5 lablet // VERSION: 1.1 // TARGET: Java v1.1 // UPDATE HISTORY: 1.1 10/2/98 new documentation and 1.1 compliance // 1.0 10/9/97 the version in _p.j_ //====================================================================== //------------------------------- NOTES -------------------------------- /* We're back to an applet that actually does something. Don't worry about the details of event handling, but in brief we've made a class we call Listener that receives events generated by clicks in the buttons and then calls the appropriate method in the SodaPop class. As a consequence of this organization, we must write a collection of methods (like processNickelButton() and processColaButton()) that will be called from the Listener object, in much the same way that init() and paint() are called from outside the applet. */ //------------------------------ IMPORTS ------------------------------- import java.awt.*; import java.awt.event.*; import java.applet.*; //=========================== SodaPop CLASS ============================ /** * This class simulates a soda machine. It is organized into two * functional parts: a panel on the left that simulates insertion * of coins and a panel on the right that "dispenses" a soda (by * placing an appropriate message in the display at the bottom) * if the user has inserted a sufficient amount of money. */ public class SodaPop extends Applet { //------------------------------ DATA ------------------------------ private MoneyPanel money; // to simulate coin insertion and return private ChoicePanel choices; // for drink selection buttons private TextField display; // for status messages private int amount, // amount available for purchase cost, // price of a drink numberColas; // colas currently on hand private Listener myListener = new Listener(this); //----------------------- THE USUAL METHODS ------------------------ /** * Lay out the two control panels and set the initial values * for the cost of a soda and the number of colas remaining. */ public void init() { setLayout(new BorderLayout()); setBackground(Color.red); choices = new ChoicePanel(myListener); add(BorderLayout.EAST, choices); money = new MoneyPanel(myListener); add(BorderLayout.WEST, money); display = new TextField(); display.setBackground(Color.white); display.setForeground(Color.red); display.setFont(new Font("SansSerif", Font.BOLD, 12)); add(BorderLayout.SOUTH, display); cost = 75; numberColas = 5; } /** * Paint the logo in the middle of the applet's frame. */ public void paint(Graphics g) { Dimension d = getSize(); int xStart = d.width / 2 - 20; int yStart = d.height / 2 - 80; g.setFont(new Font("Serif", Font.BOLD, 36)); g.setColor(Color.white); g.drawString("S", xStart, yStart); g.drawString("O", xStart, yStart + 20); g.drawString("D", xStart, yStart + 40); g.drawString("A", xStart, yStart + 60); g.drawString("P", xStart, yStart + 80); g.drawString("O", xStart, yStart + 100); g.drawString("P", xStart, yStart + 120); g.setFont(new Font("Serif", Font.ITALIC, 18)); g.setColor(Color.white); g.drawString("Insert 75 cents ...", xStart - 20, yStart + 160); } //--------------- OUR OWN METHODS TO RESPOND TO CLICKS ------------- /** * Deal with a click on the nickel button. */ void processNickelButton() { display.setText("Nickel inserted..."); amount += 5; } /** * Deal with a click on the dime button. */ void processDimeButton() { display.setText("Dime inserted..."); amount += 10; } /** * Deal with a click on the quarter button. */ void processQuarterButton() { display.setText("Quarter inserted..."); amount += 25; } /** * In response to a click on the return button, * display the amount returned and set the amount * back to zero. */ void processReturnButton() { String amountString; int dollars = amount / 100; int pennies = amount % 100; if (pennies < 10) { amountString = new String("$" + dollars + ".0" + pennies); } else { amountString = new String("$" + dollars + "." + pennies); } display.setText(amountString + " returned."); amount = 0; } /** * Try to "sell" a cola. */ void processColaButton() { if (amount >= cost) { display.setText("COLA dispensed!!!"); amount -= cost; numberColas--; } if (numberColas <= 0) { choices.disable("COLA"); } } /** * Try to "sell" a diet soda. */ void processDietButton() { if (amount >= cost) { display.setText("DIET dispensed!!!"); amount -= cost; } } /** * Try to "sell" a caffein-free, sugarless, acid-free, clear soda * (sometimes called "water"). */ void processLiteButton() { if (amount >= cost) { display.setText("LITE dispensed!!!"); amount -= cost; } } /** * Try to "sell" a root beer. */ void processRootButton() { if (amount >= cost) { display.setText("ROOT dispensed!!!"); amount -= cost; } } } //========================= MoneyPanel CLASS =========================== /** * This class is primarily for display purposes in the SodaPop applet. * It is, basically, a holder for the four money-related buttons. * It does do some event-handling in response to button clicks, but * for the purposes of this lab, you can ignore anything that has the * word "Listener" in it. */ class MoneyPanel extends Panel { private Button bNickel = new Button("Nickel"), bDime = new Button("Dime"), bQuarter = new Button("Quarter"), bReturn = new Button("Return Coins"); /** * Lay out the nickel, dime, and quarter buttons in a 3-by-1 * grid and then place them and the return button in a * 2-by-1 grid (giving a really big return button). */ public MoneyPanel(Listener theListener) { bNickel.addActionListener(theListener); bDime.addActionListener(theListener); bQuarter.addActionListener(theListener); bReturn.addActionListener(theListener); setBackground(Color.blue); setForeground(Color.white); setLayout(new GridLayout(2,1, 5, 5)); Panel p = new Panel(); p.setLayout(new GridLayout(3,1, 5, 5)); p.add(bNickel); p.add(bDime); p.add(bQuarter); add(p); add(bReturn); } } //========================= ChoicePanel CLASS ========================== /** * Like the MoneyPanel class, this class is primarily a * holder for the four drink buttons. Again, pay no attention * to anything with the word "Listener" in it. */ class ChoicePanel extends Panel { private Button bCola = new Button("COLA"), bDiet = new Button("DIET"), bLite = new Button("LITE"), bRoot = new Button("ROOT BEER"); /** * Construct a new ChoicePanel object by setting * the colors and layout and then adding the four * drink buttons. */ public ChoicePanel(Listener theListener) { bCola.addActionListener(theListener); bDiet.addActionListener(theListener); bLite.addActionListener(theListener); bRoot.addActionListener(theListener); setBackground(Color.blue); setForeground(Color.white); setLayout(new GridLayout(4,1)); add(bCola); add(bDiet); add(bLite); add(bRoot); } /** * Turn off one of the buttons. */ public void disable(String name) { if (name.equals("COLA")) { bCola.setEnabled(false); } } } //=========================== Listener CLASS =========================== /** * This class is designed to respond to button clicks * from the various buttons in our applet by calling * the applet's appropriate process() function. * For now, it's not necessary to understand what's * going on here--all will be made clear in Chapter 6. */ class Listener implements ActionListener { private SodaPop theApplet; /* * Construct a Listener object by registering * the applet that will be responding to the * events (so this object knows the SodaPop * object that owns the "process..." functions). */ public Listener(SodaPop theBigBoss) { theApplet = theBigBoss; } public void actionPerformed(ActionEvent e) { String bttnName = e.getActionCommand(); //------ Deal with clicks on the money buttons ----- if (bttnName.equals("Nickel")) { theApplet.processNickelButton(); } else if (bttnName.equals("Dime")) { theApplet.processDimeButton(); } else if (bttnName.equals("Quarter")) { theApplet.processQuarterButton(); } else if (bttnName.equals("Return Coins")) { theApplet.processReturnButton(); } //------ Deal with clicks on the soda buttons ------ if (bttnName.equals("COLA")) { theApplet.processColaButton(); } else if (bttnName.equals("DIET")) { theApplet.processDietButton(); } else if (bttnName.equals("LITE")) { theApplet.processLiteButton(); } else if (bttnName.equals("ROOT BEER")) { theApplet.processRootButton(); } } }