⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elevatorview.java

📁 JAVA 多线程不可多得的好例子
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
// 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 + -