1/* 2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * - Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * - Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * - Neither the name of Oracle nor the names of its 16 * contributors may be used to endorse or promote products derived 17 * from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 20 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32/* 33 * This source code is provided to illustrate the usage of a given feature 34 * or technique and has been deliberately simplified. Additional steps 35 * required for a production-quality application, such as security checks, 36 * input validation and proper error handling, might not be present in 37 * this sample code. 38 */ 39 40 41 42import java.awt.Graphics; 43import java.awt.Font; 44import java.applet.Applet; 45import java.awt.event.MouseEvent; 46import java.awt.event.MouseListener; 47 48 49/** 50 * An applet that displays jittering text on the screen. 51 * 52 * @author Daniel Wyszynski 04/12/95 53 * @author 05/09/95 kwalrath Changed string; added thread suspension 54 * @author 02/06/98 madbot removed use of suspend and resume and cleaned up 55 */ 56@SuppressWarnings("serial") 57public class NervousText extends Applet implements Runnable, MouseListener { 58 59 String banner; // The text to be displayed 60 char bannerChars[]; // The same text as an array of characters 61 char attributes[]; // Character attributes ('^' for superscript) 62 Thread runner = null; // The thread that is displaying the text 63 boolean threadSuspended; // True when thread suspended (via mouse click) 64 static final int REGULAR_WD = 15; 65 static final int REGULAR_HT = 36; 66 static final int SMALL_WD = 12; 67 static final int SMALL_HT = 24; 68 Font regularFont = new Font("Serif", Font.BOLD, REGULAR_HT); 69 Font smallFont = new Font("Serif", Font.BOLD, SMALL_HT); 70 71 @Override 72 public void init() { 73 banner = getParameter("text"); 74 if (banner == null) { 75 banner = "Java Development Kit "; 76 } 77 banner += System.getProperty("java.version", ""); 78 79 int bannerLength = banner.length(); 80 StringBuilder bc = new StringBuilder(bannerLength); 81 StringBuilder attrs = new StringBuilder(bannerLength); 82 int wd = 0; 83 for (int i = 0; i < bannerLength; i++) { 84 char c = banner.charAt(i); 85 char a = 0; 86 if (c == '^') { 87 i++; 88 if (i < bannerLength) { 89 c = banner.charAt(i); 90 a = '^'; 91 wd += SMALL_WD - REGULAR_WD; 92 } else { 93 break; 94 } 95 } 96 bc.append(c); 97 attrs.append(a); 98 wd += REGULAR_WD; 99 } 100 101 bannerLength = bc.length(); 102 bannerChars = new char[bannerLength]; 103 attributes = new char[bannerLength]; 104 bc.getChars(0, bannerLength, bannerChars, 0); 105 attrs.getChars(0, bannerLength, attributes, 0); 106 107 threadSuspended = false; 108 resize(wd + 10, 50); 109 addMouseListener(this); 110 } 111 112 @Override 113 public void destroy() { 114 removeMouseListener(this); 115 } 116 117 @Override 118 public void start() { 119 runner = new Thread(this); 120 runner.start(); 121 } 122 123 @Override 124 public synchronized void stop() { 125 runner = null; 126 if (threadSuspended) { 127 threadSuspended = false; 128 notify(); 129 } 130 } 131 132 @Override 133 public void run() { 134 Thread me = Thread.currentThread(); 135 while (runner == me) { 136 try { 137 Thread.sleep(100); 138 synchronized (this) { 139 while (threadSuspended) { 140 wait(); 141 } 142 } 143 } catch (InterruptedException e) { 144 } 145 repaint(); 146 } 147 } 148 149 @Override 150 public void paint(Graphics g) { 151 int length = bannerChars.length; 152 for (int i = 0, x = 0; i < length; i++) { 153 int wd, ht; 154 if (attributes[i] == '^') { 155 wd = SMALL_WD; 156 ht = SMALL_HT; 157 g.setFont(smallFont); 158 } else { 159 wd = REGULAR_WD; 160 ht = REGULAR_HT; 161 g.setFont(regularFont); 162 } 163 int px = (int) (10 * Math.random() + x); 164 int py = (int) (10 * Math.random() + ht); 165 g.drawChars(bannerChars, i, 1, px, py); 166 x += wd; 167 } 168 } 169 170 @Override 171 public synchronized void mousePressed(MouseEvent e) { 172 e.consume(); 173 threadSuspended = !threadSuspended; 174 if (!threadSuspended) { 175 notify(); 176 } 177 } 178 179 @Override 180 public void mouseReleased(MouseEvent e) { 181 } 182 183 @Override 184 public void mouseEntered(MouseEvent e) { 185 } 186 187 @Override 188 public void mouseExited(MouseEvent e) { 189 } 190 191 @Override 192 public void mouseClicked(MouseEvent e) { 193 } 194 195 @Override 196 public String getAppletInfo() { 197 return "Title: NervousText\nAuthor: Daniel Wyszynski\n" 198 + "Displays a text banner that jitters."; 199 } 200 201 @Override 202 public String[][] getParameterInfo() { 203 String pinfo[][] = { 204 { "text", "string", "Text to display" }, }; 205 return pinfo; 206 } 207} 208