📄 elevatorview.java
字号:
// ElevatorView.java
// View for ElevatorSimulation
package com.deitel.jhtp5.elevator.view;
// Java core packages
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.applet.*;
// Java extension package
import javax.swing.*;
// Deitel packages
import com.deitel.jhtp5.elevator.event.*;
import com.deitel.jhtp5.elevator.ElevatorConstants;
public class ElevatorView extends JPanel
implements ActionListener, ElevatorSimulationListener,
ElevatorConstants {
// ElevatorView dimensions
private static final int VIEW_WIDTH = 800;
private static final int VIEW_HEIGHT = 435;
// offset for positioning Panels in ElevatorView
private static final int OFFSET = 10;
// Elevator repaints components every 50 ms
private static final int ANIMATION_DELAY = 50;
// horizontal distance constants
private static final int PERSON_TO_BUTTON_DISTANCE = 400;
private static final int BUTTON_TO_ELEVATOR_DISTANCE = 50;
private static final int PERSON_TO_ELEVATOR_DISTANCE =
PERSON_TO_BUTTON_DISTANCE + BUTTON_TO_ELEVATOR_DISTANCE;
// times walking to Floor's Button and Elevator
private static final int TIME_TO_BUTTON = 3000; // 3 seconds
private static final int TIME_TO_ELEVATOR = 1000; // 1 second
// time traveling in Elevator (5 seconds)
private static final int ELEVATOR_TRAVEL_TIME = 5000;
// Door images for animation
private static final String doorFrames[] = {
"images/door1.png", "images/door2.png", "images/door3.png",
"images/door4.png", "images/door5.png" };
// Person images for animation
private static final String personFrames[] = {
"images/bug1.png", "images/bug2.png", "images/bug3.png",
"images/bug4.png", "images/bug5.png", "images/bug6.png",
"images/bug7.png", "images/bug8.png" };
// Light images for animation
private static final String lightFrames[] = {
"images/lightOff.png", "images/lightOn.png" };
// Floor Light images for animation
private static final String firstFloorLightFrames[] = {
"images/firstFloorLightOff.png",
"images/firstFloorLightOn.png" };
private static final String secondFloorLightFrames[] = {
"images/secondFloorLightOff.png",
"images/secondFloorLightOn.png", };
// Floor Button images for animation
private static final String floorButtonFrames[] = {
"images/floorButtonUnpressed.png",
"images/floorButtonPressed.png",
"images/floorButtonLit.png" };
// Elevator Button images for animation
private static final String elevatorButtonFrames[] = {
"images/elevatorButtonUnpressed.png",
"images/elevatorButtonPressed.png",
"images/elevatorButtonLit.png" };
// Bell images for animation
private static final String bellFrames[] = {
"images/bell1.png", "images/bell2.png",
"images/bell3.png" };
private static final String floorImage =
"images/floor.png";
private static final String ceilingImage =
"images/ceiling.png";
private static final String elevatorImage =
"images/elevator.png";
private static final String wallImage =
"images/wall.jpg";
private static final String elevatorShaftImage =
"images/elevatorShaft.png";
// audio files
private static final String bellSound = "bell.wav";
private static final String doorOpenSound = "doorOpen.wav";
private static final String doorCloseSound = "doorClose.wav";
private static final String elevatorSound = "elevator.au";
private static final String buttonSound = "button.wav";
private static final String walkingSound = "walk.wav";
private static final String elevatorMusicSound = "liszt.mid";
// ImagePanels for Floors, ElevatorShaft, wall and ceiling
private ImagePanel firstFloorPanel;
private ImagePanel secondFloorPanel;
private ImagePanel elevatorShaftPanel;
private ImagePanel wallPanel;
private ImagePanel ceilingPanel;
// MovingPanels for Elevator
private MovingPanel elevatorPanel;
// AnimatedPanels for Buttons, Bell, Lights and Door
private AnimatedPanel firstFloorButtonPanel;
private AnimatedPanel secondFloorButtonPanel;
private AnimatedPanel elevatorButtonPanel;
private AnimatedPanel bellPanel;
private AnimatedPanel elevatorLightPanel;
private AnimatedPanel firstFloorLightPanel;
private AnimatedPanel secondFloorLightPanel;
private AnimatedPanel doorPanel;
// List containing AnimatedPanels for all Person objects
private java.util.List personAnimatedPanels;
// AudioClips for sound effects
private AudioClip bellClip;
private AudioClip doorOpenClip;
private AudioClip doorCloseClip;
private AudioClip elevatorClip;
private AudioClip buttonClip;
private AudioClip walkClip;
// ElevatorMusic to play in Elevator
private AudioClip elevatorMusicClip;
// Timer for animation controller;
private javax.swing.Timer animationTimer;
// distance from top of screen to display Floors
private int firstFloorPosition;
private int secondFloorPosition;
// Elevator's velocity
private double elevatorVelocity;
// ElevatorView constructor
public ElevatorView()
{
// specifiy null Layout
super( null );
instantiatePanels();
placePanelsOnView();
initializeAudio();
// calculate distance Elevator travels
double floorDistance =
firstFloorPosition - secondFloorPosition;
// calculate time needed for travel
double time = ELEVATOR_TRAVEL_TIME / ANIMATION_DELAY;
// determine Elevator velocity (rate = distance / time)
elevatorVelocity = ( floorDistance + OFFSET ) / time;
// start animation Thread
startAnimation();
} // end ElevatorView constructor
// instantiate all Panels (Floors, Elevator, etc.)
private void instantiatePanels()
{
// instantiate ImagePanels representing Floors
firstFloorPanel = new ImagePanel( 0, floorImage );
secondFloorPanel = new ImagePanel( 0, floorImage );
// calculate first and second Floor positions
firstFloorPosition =
VIEW_HEIGHT - firstFloorPanel.getHeight();
secondFloorPosition =
( int ) ( firstFloorPosition / 2 ) - OFFSET;
firstFloorPanel.setPosition( 0, firstFloorPosition );
secondFloorPanel.setPosition( 0, secondFloorPosition );
wallPanel = new ImagePanel( 0, wallImage );
// create and position ImagePanel for ElevatorShaft
elevatorShaftPanel =
new ImagePanel( 0, elevatorShaftImage );
double xPosition = PERSON_TO_ELEVATOR_DISTANCE + OFFSET;
double yPosition =
firstFloorPosition - elevatorShaftPanel.getHeight();
elevatorShaftPanel.setPosition( xPosition, yPosition );
// create and position ImagePanel for ceiling
ceilingPanel = new ImagePanel( 0, ceilingImage );
yPosition = elevatorShaftPanel.getPosition().getY() -
ceilingPanel.getHeight();
ceilingPanel.setPosition( xPosition, yPosition );
// create and position MovingPanel for Elevator
elevatorPanel = new MovingPanel( 0, elevatorImage );
yPosition = firstFloorPosition - elevatorPanel.getHeight();
elevatorPanel.setPosition( xPosition, yPosition );
// create and position first Floor Button
firstFloorButtonPanel =
new AnimatedPanel( 0, floorButtonFrames );
xPosition = PERSON_TO_BUTTON_DISTANCE + 2 * OFFSET;
yPosition = firstFloorPosition - 5 * OFFSET;
firstFloorButtonPanel.setPosition( xPosition, yPosition );
int floorButtonPressedFrameOrder[] = { 0, 1, 2 };
firstFloorButtonPanel.addFrameSequence(
floorButtonPressedFrameOrder );
// create and position second Floor Button
secondFloorButtonPanel =
new AnimatedPanel( 1, floorButtonFrames );
xPosition = PERSON_TO_BUTTON_DISTANCE + 2 * OFFSET;
yPosition = secondFloorPosition - 5 * OFFSET;
secondFloorButtonPanel.setPosition( xPosition, yPosition );
secondFloorButtonPanel.addFrameSequence(
floorButtonPressedFrameOrder );
// create and position Floor Lights
firstFloorLightPanel =
new AnimatedPanel( 0, firstFloorLightFrames );
xPosition = elevatorPanel.getLocation().x - 4 * OFFSET;
yPosition =
firstFloorButtonPanel.getLocation().y - 10 * OFFSET;
firstFloorLightPanel.setPosition( xPosition, yPosition );
secondFloorLightPanel =
new AnimatedPanel( 1, secondFloorLightFrames );
yPosition =
secondFloorButtonPanel.getLocation().y - 10 * OFFSET;
secondFloorLightPanel.setPosition( xPosition, yPosition );
// create and position Door AnimatedPanels
doorPanel = new AnimatedPanel( 0, doorFrames );
int doorOpenedFrameOrder[] = { 0, 1, 2, 3, 4 };
int doorClosedFrameOrder[] = { 4, 3, 2, 1, 0 };
doorPanel.addFrameSequence( doorOpenedFrameOrder );
doorPanel.addFrameSequence( doorClosedFrameOrder );
// determine where Door is located relative to Elevator
yPosition =
elevatorPanel.getHeight() - doorPanel.getHeight();
doorPanel.setPosition( 0, yPosition );
// create and position Light AnimatedPanel
elevatorLightPanel = new AnimatedPanel( 0, lightFrames );
elevatorLightPanel.setPosition( OFFSET, 5 * OFFSET );
// create and position Bell AnimatedPanel
bellPanel = new AnimatedPanel( 0, bellFrames );
yPosition = elevatorLightPanel.getPosition().getY() +
elevatorLightPanel.getHeight() + OFFSET;
bellPanel.setPosition( OFFSET, yPosition );
int bellRingAnimation[] = { 0, 1, 0, 2 };
bellPanel.addFrameSequence( bellRingAnimation );
// create and position Elevator's Button AnimatedPanel
elevatorButtonPanel =
new AnimatedPanel( 0, elevatorButtonFrames );
yPosition = elevatorPanel.getHeight() - 6 * OFFSET;
elevatorButtonPanel.setPosition( 10 * OFFSET, yPosition );
int buttonPressedFrameOrder[] = { 0, 1, 2 };
elevatorButtonPanel.addFrameSequence(
buttonPressedFrameOrder );
// create List to store Person AnimatedPanels
personAnimatedPanels = new ArrayList();
} // end method instantiatePanels
// place all Panels on ElevatorView
private void placePanelsOnView()
{
// add Panels to ElevatorView
add( firstFloorPanel );
add( secondFloorPanel );
add( ceilingPanel );
add( elevatorPanel );
add( firstFloorButtonPanel );
add( secondFloorButtonPanel );
add( firstFloorLightPanel );
add( secondFloorLightPanel );
add( elevatorShaftPanel );
add( wallPanel );
// add Panels to Elevator's MovingPanel
elevatorPanel.add( doorPanel );
elevatorPanel.add( elevatorLightPanel );
elevatorPanel.add( bellPanel );
elevatorPanel.add( elevatorButtonPanel );
} // end method placePanelsOnView
// get sound effects and elevatorMusic
private void initializeAudio()
{
// create AudioClip sound effects from audio files
SoundEffects sounds = new SoundEffects();
sounds.setPathPrefix( "sounds/" );
bellClip = sounds.getAudioClip( bellSound );
doorOpenClip = sounds.getAudioClip( doorOpenSound );
doorCloseClip = sounds.getAudioClip( doorCloseSound );
elevatorClip = sounds.getAudioClip( elevatorSound );
buttonClip = sounds.getAudioClip( buttonSound );
walkClip = sounds.getAudioClip( walkingSound );
elevatorMusicClip = sounds.getAudioClip( elevatorMusicSound );
} // end method initializeAudio
// starts animation by repeatedly drawing images to screen
public void startAnimation()
{
if ( animationTimer == null ) {
animationTimer =
new javax.swing.Timer( ANIMATION_DELAY, this );
animationTimer.start();
}
else
if ( !animationTimer.isRunning() )
animationTimer.restart();
}
// stop animation
public void stopAnimation()
{
animationTimer.stop();
}
// update AnimatedPanels animation in response to Timer
public void actionPerformed( ActionEvent actionEvent )
{
elevatorPanel.animate();
firstFloorButtonPanel.animate();
secondFloorButtonPanel.animate();
Iterator iterator = getPersonAnimatedPanelsIterator();
while ( iterator.hasNext() ) {
// get Person's AnimatedPanel from Set
AnimatedPanel personPanel =
( AnimatedPanel ) iterator.next();
personPanel.animate(); // update panel
}
repaint(); // paint all Components
} // end method actionPerformed
private Iterator getPersonAnimatedPanelsIterator()
{
// obtain iterator from List
synchronized( personAnimatedPanels )
{
return new ArrayList( personAnimatedPanels ).iterator();
}
}
// stop sound clip of Person walking
private void stopWalkingSound()
{
// stop playing walking sound
walkClip.stop();
Iterator iterator = getPersonAnimatedPanelsIterator();
// but if Person is still walking, then keep playing
while ( iterator.hasNext() ) {
AnimatedPanel panel = ( AnimatedPanel ) iterator.next();
if ( panel.getXVelocity() != 0 )
walkClip.loop();
}
} // end method stopWalkingSound
// returns Person AnimatedPanel with proper identifier
private AnimatedPanel getPersonPanel( PersonMoveEvent event )
{
Iterator iterator = getPersonAnimatedPanelsIterator();
while ( iterator.hasNext() ) {
// get next AnimatedPanel
AnimatedPanel personPanel =
( AnimatedPanel ) iterator.next();
// return AnimatedPanel with identifier that matches
if ( personPanel.getID() == event.getID() )
return personPanel;
}
// return null if no match with correct identifier
return null;
} // end method getPersonPanel
// invoked when Elevator has departed from Floor
public void elevatorDeparted( ElevatorMoveEvent moveEvent )
{
String location =
moveEvent.getLocation().getLocationName();
// determine if Person is on Elevator
Iterator iterator = getPersonAnimatedPanelsIterator();
while ( iterator.hasNext() ) {
AnimatedPanel personPanel =
( AnimatedPanel ) iterator.next();
double yPosition = personPanel.getPosition().getY();
String panelLocation;
// determine on which Floor the Person entered
if ( yPosition > secondFloorPosition )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -