1 /*
   2  *
   3  * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
   4  *
   5  * Redistribution and use in source and binary forms, with or without
   6  * modification, are permitted provided that the following conditions
   7  * are met:
   8  *
   9  *   - Redistributions of source code must retain the above copyright
  10  *     notice, this list of conditions and the following disclaimer.
  11  *
  12  *   - Redistributions in binary form must reproduce the above copyright
  13  *     notice, this list of conditions and the following disclaimer in the
  14  *     documentation and/or other materials provided with the distribution.
  15  *
  16  *   - Neither the name of Oracle nor the names of its
  17  *     contributors may be used to endorse or promote products derived
  18  *     from this software without specific prior written permission.
  19  *
  20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  21  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31  */
  32 
  33 
  34 package java2d;
  35 
  36 
  37 /**
  38  * Demos that animate extend this class.
  39  */
  40 @SuppressWarnings("serial")
  41 public abstract class AnimatingSurface extends Surface implements Runnable {
  42 
  43     private volatile boolean running = false;
  44 
  45     private volatile Thread thread;
  46 
  47     public abstract void step(int w, int h);
  48 
  49     public abstract void reset(int newwidth, int newheight);
  50 
  51 
  52     public synchronized void start() {
  53         if (!running() && !dontThread) {
  54             thread = new Thread(this);
  55             thread.setPriority(Thread.MIN_PRIORITY);
  56             thread.setName(name + " Demo");
  57             thread.start();
  58             running = true;
  59         }
  60     }
  61 
  62 
  63     public synchronized void stop() {
  64         if (thread != null) {
  65             running = false;
  66             thread.interrupt();
  67         }
  68         thread = null;
  69         notifyAll();
  70     }
  71 
  72 
  73     @Override
  74     @SuppressWarnings("SleepWhileHoldingLock")
  75     public void run() {
  76 
  77         while (running() && !isShowing() || getSize().width == 0) {
  78             try {
  79                 Thread.sleep(200);
  80             } catch (InterruptedException ignored) {
  81             }
  82         }
  83 
  84         while (running()) {
  85             repaint();
  86             try {
  87                 Thread.sleep(sleepAmount);
  88             } catch (InterruptedException ignored) {
  89             }
  90         }
  91         synchronized (this) {
  92             running = false;
  93         }
  94     }
  95 
  96     /**
  97      * @return the running
  98      */
  99     public synchronized boolean running() {
 100         return running;
 101     }
 102 
 103     /**
 104      * Causes surface to repaint immediately
 105      */
 106     public synchronized void doRepaint() {
 107         if (running() && thread != null) {
 108             thread.interrupt();
 109         }
 110     }
 111 }