Tuesday, 28 February 2017

Chapter 30 Exercise 3, Introduction to Java Programming, Tenth Edition Y. Daniel LiangY.

30.3 (Raise flags) Rewrite Listing 15.13 using a thread to animate a flag being
raised. Compare the program with Listing 15.13 by setting the delay time to 10
in both programs. Which one runs the animation faster?

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.*;

import javax.swing.*;

public class Exercise03 extends JApplet{
 private static final long serialVersionUID = 1L;

 
 public Exercise03() {
  FlagPanel flagPanel = new FlagPanel();
  add(flagPanel);
  Thread thread = new Thread(flagPanel);
  thread.start();
 }

 public static void main(String[] args) {
  JFrame frame = new JFrame();
  frame.add(new Exercise03());
  frame.setTitle("Exercise03");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setSize(500, 500);
  frame.setMinimumSize(new Dimension(frame.getWidth(), frame.getHeight()));
  frame.setLocationRelativeTo(null);
  frame.setVisible(true);
 }

 class FlagPanel extends JPanel implements Runnable {
  private int currentFlag = 0;
  private ImageIcon imageIcon;
  private int x;
  private int y;
  private static final long serialVersionUID = 1L;
  private boolean newFlag = true;
  private AudioClip[] audioClip = new AudioClip[7];
  private Image image;
  
  public FlagPanel() {
   for (int i = 0; i < audioClip.length; i++) {
    audioClip[i] = Applet.newAudioClip(this.getClass().getResource("anthem" + i + ".mid")); 
   }   
  }
  
  @Override
  protected void paintComponent(Graphics g) {
   super.paintComponent(g);
   if (newFlag) {
    audioClip[currentFlag].play();
    y = getHeight();
    newFlag = false;
    imageIcon = new ImageIcon(this.getClass().getResource("flag" + currentFlag + ".gif"));
    image = imageIcon.getImage();
   }
   x = (getWidth() - imageIcon.getIconWidth()) / 2;
   g.drawImage(image, x,  y, imageIcon.getIconWidth(), imageIcon.getIconHeight(), this);
   if (y + imageIcon.getIconHeight() <= 0) {
    newFlag = true;
    audioClip[currentFlag].stop();
    currentFlag++;
    if (currentFlag > 6) {
     currentFlag = 0;
    }    
   }
  }

  @Override
  public void run() {
   try {
    while (true) {
     Thread.sleep(10);
     y--;          
     repaint();
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
}

No comments :

Post a Comment