Computer Science 252
 Problem Solving with Java
Fall 2015, The College of Saint Rose
FallingBallComboReact Demo
A working demo of FallingBallComboReact will appear below. Click inside the applet to interact with it.
FallingBallComboReact BlueJ Project
Click here to download a BlueJ project for FallingBallComboReact.
FallingBallComboReact Source Code
The Java source code for FallingBallComboReact is below. Click on a file name to download it.
import objectdraw.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
/*
 * Example FallingBallComboReact: create a falling ball whose speed
 * depends on the value of a JComboBox, but also have the most recently
 * created ball change its speed when the menu selection changes.
 *
 * Jim Teresco, The College of Saint Rose, CSC 252, Fall 2013
 *
 * $Id: FallingBallComboReact.java 2227 2013-10-24 03:37:54Z terescoj $
 */
public class FallingBallComboReact extends WindowController implements ActionListener {
    private static final int SLOW_SPEED = 2;
    private static final int MEDIUM_SPEED = 5;
    private static final int FAST_SPEED = 10;
    // we'll be using a JComboBox in begin and in
    // actionPerformed, so we need to remember it.
    private JComboBox speedMenu;
    // the ball, so we can tell it to change speeds
    private Ball lastLaunch;
    public void begin() {
        setSize(500, 500);
        // We still need our content pane
        Container contentPane = getContentPane();
        // A JPanel, in which we will group together our JButton
        // and JComboBox
        JPanel southPanel = new JPanel();
        // Next, we'll create just one button and add it to our
        // JPanel.
        JButton createBallButton = new JButton("Drop Ball");
        southPanel.add(createBallButton);
        // construct a JComboBox
        speedMenu = new JComboBox();
        // and some menu entries therein
        speedMenu.addItem("Slow");
        speedMenu.addItem("Medium");
        speedMenu.addItem("Fast");
        // which one is selected when we start?
        speedMenu.setSelectedItem("Medium");
        // and put our JComboBox into our JPanel
        southPanel.add(speedMenu);
        // now, we add the JPanel (which contains our JButton
        // and JComboBox) to the content pane, in the south
        contentPane.add(southPanel, BorderLayout.SOUTH);
        // add our action listener
        createBallButton.addActionListener(this);
        speedMenu.addActionListener(this);
        // put at end of all methods that change the layout
        contentPane.validate();
    }
    // actionPerformed this time needs to differentiate between
    // an event triggered by a button press vs. one triggered by
    // the combo box selection changing
    public void actionPerformed(ActionEvent e) {
        // first, we do some things that have to happen
        // regardless of why we were called
        
        double speed;
        // this will return the selected item from the JComboBox
        Object selectedSpeed = speedMenu.getSelectedItem();
        // now we see which one it is by comparing to the Strings
        // we used when we added the menu items above.
        if (selectedSpeed.equals("Slow")) {
            speed = SLOW_SPEED;
        } 
        else if (selectedSpeed.equals("Medium")) {
            speed = MEDIUM_SPEED;
        } 
        else {  // "Fast" is the only other possibility
            speed = FAST_SPEED;
        }
        
        // now why are we here?
        if (e.getSource() == speedMenu) {
            // menu item changed - change the speed of the last ball
            // if we have one
            if (lastLaunch != null) {
                lastLaunch.setSpeed(speed);
            }
        }
        else {
            // we must have pressed the button for a new ball, so
            // let's create one.
            lastLaunch = new Ball(new Location(200, 0), speed, canvas);
        }
    }
}
import objectdraw.*;
import java.awt.*;
/*
/*
 * Example FallingBallUglyButtons: 
 * A Ball that will drop to the bottom of the canvas.
 *
 * Jim Teresco, The College of Saint Rose, Fall 2013
 *
 * $Id: Ball.java 2227 2013-10-24 03:37:54Z terescoj $
 */
public class Ball extends ActiveObject {
    
    private static final int BALL_SIZE = 30;
    private static final int PAUSE_TIME = 30;
    // The representation of the ball on the screen
    private FilledOval ball;
    // The bottom of the playing area
    private int bottomHeight;
    private double ySpeed;
    // Construct a new Ball with the given starting location and y velocity.
    public Ball(Location point, double speed, DrawingCanvas aCanvas) {
        ball = new FilledOval(point, BALL_SIZE, BALL_SIZE, aCanvas);
        ySpeed = speed;
        bottomHeight = aCanvas.getHeight();
        start();
    }
    public void run() {
        while (ball.getY() < bottomHeight) {
            ball.move(0, ySpeed);
            pause(PAUSE_TIME);
        }
        ball.removeFromCanvas();
    }
    
    // this program requires that our ball's speed can change
    public void setSpeed(double newSpeed) {
        
        ySpeed = newSpeed;
    }
    
}