Computer Science 252
Problem Solving with Java
Spring 2014, The College of Saint Rose
FallingBallSlider Demo
A working demo of FallingBallSlider will appear below. Click inside the applet to interact with it.
FallingBallSlider BlueJ Project
Click here to download a BlueJ project for FallingBallSlider.
FallingBallSlider Source Code
The Java source code for FallingBallSlider 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.JSlider; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /* * Example FallingBallSlider: a slider for finer control over * ball speeds. * * Jim Teresco, The College of Saint Rose, CSC 252, Fall 2013 * * $Id: FallingBallSlider.java 2227 2013-10-24 03:37:54Z terescoj $ */ // Note here that our class serves as both an ActionListener and // a ChangeListener, so we specify that it implements both, and // separate by commas. A class can implement as many interfaces // as we wish, so long as we provide all of the required methods // for each interface. public class FallingBallSlider extends WindowController implements ActionListener, ChangeListener { private static final int MIN_SPEED = 2; private static final int MAX_SPEED = 10; // using a JSlider this time private JSlider speedControl; // the ball, so we can set its speed 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 northPanel = new JPanel(); // Next, we'll create just one button and add it to our // JPanel. JButton createBallButton = new JButton("Drop Ball"); northPanel.add(createBallButton); // construct a JSlider: // the first parameter is orientation, we choose horizontal // the remaining parameters are the values associated with // the minimum, maximum, and initial values of the slider speedControl = new JSlider(JSlider.HORIZONTAL, MIN_SPEED, MAX_SPEED, MIN_SPEED); // and put our JSlider into our JPanel northPanel.add(speedControl); // now, we add the JPanel (which contains our JButton // and JPanel) to the content pane, this time in the // north, why not? contentPane.add(northPanel, BorderLayout.NORTH); // add our action listener for the button createBallButton.addActionListener(this); // and our change listener for the slider speedControl.addChangeListener(this); // put at end of all methods that change the layout contentPane.validate(); } // actionPerformed this time only deals with creating a new // ball, but it needs to query the current slider state // to decide on the ball's initial speed. public void actionPerformed(ActionEvent e) { // get the speed from the JSlider double speed = speedControl.getValue(); // go ahead and create the new ball lastLaunch = new Ball(new Location(200, 0), speed, canvas); } // our slider generates ChangeEvents, delivered to // the stateChanged method, as required by the ChangeListener // interface public void stateChanged(ChangeEvent e) { // if we've launched a ball, set its speed. if (lastLaunch != null) { lastLaunch.setSpeed(speedControl.getValue()); } } }