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 
step(int w, int h)47     public abstract void step(int w, int h);
48 
reset(int newwidth, int newheight)49     public abstract void reset(int newwidth, int newheight);
50 
51 
start()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 
stop()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")
run()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      */
running()99     public synchronized boolean running() {
100         return running;
101     }
102 
103     /**
104      * Causes surface to repaint immediately
105      */
doRepaint()106     public synchronized void doRepaint() {
107         if (running() && thread != null) {
108             thread.interrupt();
109         }
110     }
111 }
112