TweetFollow Us on Twitter

Blinking Letters
Volume Number:12
Issue Number:8
Column Tag:Getting Started

Blinking Letters, Before

By Dave Mark

Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.

I just got back from the World Wide Developer’s Conference, where I got very little sleep but had a fantastic time. I saw Gil Amelio’s long-awaited speech, reunited with friends I only get to see a few times a year, got a chance to hone my Java skills, smoked some cigars, and even took a small side trip to Napa Valley.

Before I got to the show, I wrote a small applet for this month’s column. All puffed up with pride, I showed the applet to Peter Lewis (if you don’t know Peter, check out Anarchie, along with his other cool Internet shareware, and peruse the May 1996 issue of MacTech™ Magazine, in which he features heavily), and asked him if he had any comments. What I got back from Peter was a complete rewrite that had a better design, and ran a lot faster to boot!

So here’s what I’m going to do. This month, we’ll go over my original applet, step by step. Once you understand the applet, take some time to think about how you might improve the design. Next month, we’ll take a look at Peter Lewis’ rewrite.

The Original Applet

My applet started life as one of the standard sample Java applets that ships with the JDK. The original Blink was written by Arthur van Hoff (thanks, Arthur) and is shown in Figure 1. It paints a specified string in the applet window, then repeatedly and randomly redraws the words in the window in a series of related colors. (Some words are drawn in the background color, rendering them invisible.)

Figure 1. The original Blink,
as found in the Sun Java sample applets

I rewrote Blink so that it would display its string in a bigger font, blinking the individual letters in completely random colors, as opposed to the related colors used by original Blink. Since I used CodeWarrior to build the applet, I renamed it CWBlink.

Figure 2. My rewrite of Blink, now called CWBlink

Creating the CWBlink Applet

Here’s how I created the CWBlink applet. I started in the CodeWarrior IDE. Since CodeWarrior uses a front-end/back-end architecture (front-end drop-ins for language, back-end drop-ins for target machines), they use the same IDE and debugger for Java as they use for C, C++, and Pascal.

Inside the IDE, I created a new project, using the Java Applet stationery (Figure 3).

Figure 3. The New Project dialog box,
showing the Java Applet stationery

Figure 4. The new Java Applet project window,
before we replace the .html and .java files

Once the project was created (Figure 4), the next step was to replace the .html and .java files with our own. First, I double-clicked the file <replace me Applet>.html in the Project window. When the stationery file opens (notice that it is marked as read-only), I selected Save As... from the File menu and saved the file as CWBlink.html. Next, I replaced the text in the .html file with the following:

<title>Blinking CodeWarrior</title>
<hr>
<applet codebase="CWBlink Classes" code="CWBlink.class" width=530 height=100>
<param name=blinker value="CodeWarrior!!!">
<param name=speed value=1000>
</applet>
<hr>
<a href="CWBlink.java">The source.</a>

Once your HTML is typed in, save the code and close the file.

The HTML code should look familiar. Note that the codebase attribute tells the Java virtual machine the name of the folder containing your class files. The code attribute tells the VM the name of the class file to start with. The blinker parameter is the string that does the blinking. The speed parameter lets you change the speed of the blinking.

Next, double-click the file <replace me Applet>.java. Save the file as CWBlink.java. Replace the contents of the file with the following:

import java.awt.*;

public class CWBlink extends java.applet.Applet
 implements Runnable
{
 Thread blinkThread;
 String blinkString;
 Font   font;
 int    speed;

 public void init()
 {
 font = new java.awt.Font(
 "TimesRoman", Font.PLAIN, 64);
 
 String att = getParameter("speed");
 speed = (att == null) ? 400 :
 (1000 / Integer.valueOf(att).intValue());
 
 att = getParameter("blinker");
 blinkString = (att == null) ? "CodeWarrior!!!" : att;
 }
  
 public void paint(Graphics g)
 {
 int x = 0, y = font.getSize()-10;

 g.setColor(Color.black);
 g.setFont(font);
 FontMetrics fm = g.getFontMetrics();
 
 for (int index=0; index<blinkString.length(); index++ )
 {
 int red = (int)(Math.random() * 256);
 int green = (int)(Math.random() * 256);
 int blue = (int)(Math.random() * 256);
 
 char character = blinkString.charAt(index);
 int w = fm.charWidth(character);
   
 g.setColor( new java.awt.Color( red, green, blue ) );
 
 Character c = new Character( character );
 g.drawString(c.toString(), x, y );
 x += w;
 }
 }

 public void start()
 {
 blinkThread = new Thread(this);
 blinkThread.start();
 }

 public void stop()
 {
 blinkThread.stop();
 }

 public void run()
 {
 while (true)
 {
 try {Thread.currentThread().sleep(speed);}
 catch (InterruptedException e){}
 repaint();
 }
 }
}

The last step in setting up your project is to tell CodeWarrior how you want your applet classes saved. Select Preferences from the Edit menu. When the Preferences dialog appears (Figure 5), select the Java Project item under the Project heading. Make sure “Class Folder” is selected from the Project Type popup. Now type CWBlink Classes in the Folder Name field. This tells CodeWarrior to save all of your classes as .class files in a folder named CWBlink Classes, which is what’s expected by the HTML you typed in earlier.

Figure 5. The Java Project pane from
CodeWarrior’s Preferences dialog

Select Make from the Project menu to compile your .java file and save out your new .class file. Once your code compiles, CodeWarrior will create a new folder called CWBlink Classes, then create a new class file named CWBlink.class inside the CWBlink Classes folder. Once that happens, drag your HTML file onto the Metrowerks Java application. Metrowerks Java will parse your HTML code and run your brand new blinking applet.

Let’s take a look at the source code.

CWBlink Source Code

CWBlink.java starts by importing the java.awt classes. Next, the CWBlink class is defined. Notice that CWBlink extends the Applet class (you’ve seen this before) and also implements the Runnable interface (something new). Here’s what the Sun HTML doc has to say about the java.lang.Runnable interface:

“This interface is designed to provide a common protocol for Objects that wish to execute code while they are active. For example, Runnable is implemented by class Thread. Being active simply means that a thread has been started and has not yet been stopped.

“In addition, Runnable provides the means for a class to be active while not subclassing Thread. A class that implements Runnable can run without subclassing Thread by instantiating a Thread instance and passing itself in as the target. In most cases, the Runnable interface should be used if you are only planning to override the run() method and no other Thread methods. This is important because classes should not be subclassed unless the programmer intends on modifying or enhancing the fundamental behavior of the class.”

Basically, extending an existing class is the traditional subclassing mechanism you are used to from C++. An interface defines a set of methods and variables that will be available from within any class implementing that interface. For example, to implement the Runnable interface, you must provide a method named run() that gets executed when your object is activated. As the HTML summary indicates, the Runnable interface is implemented by the Thread class. The run() method is where the thread’s action takes place.

import java.awt.*;

public class CWBlink extends java.applet.Applet
 implements Runnable
{
 Thread blinkThread;
 String blinkString;
 Font   font;
 int    speed;

The init() method is called when the applet is created. We’ll start off the initialization process by creating a Font object that defines how the blinking text will appear. Next, we’ll load the speed and blinker parameters. Note that speed gets a default value of 400 (otherwise, the value is 1000 divided by the provided value) and blinkString gets a default value of "CodeWarrior!!!".

 public void init()
 {
 font = new java.awt.Font(
 "TimesRoman", Font.PLAIN, 64);
 
 String att = getParameter("speed");
 speed = (att == null) ? 400 :
 (1000 / Integer.valueOf(att).intValue());
 
 att = getParameter("blinker");
 blinkString = (att == null) ? "CodeWarrior!!!" : att;
 }

paint() gets called when the applet’s pane gets an update event. We’ll draw the blinkString at the x and y coordinates. We use the font’s point size to calculate the point where we draw the string in the applet’s pane.

 public void paint(Graphics g)
 {
 int x = 0, y = font.getSize()-10;

We’ll set the foreground color to black and the current font to font. We’ll also build a FontMetrics object from the current Graphics environment. To learn about FontMetrics, see the HTML file java.awt.FontMetrics. This will give us access to methods like charWidth() which lets us calculate the proper x-coordinate for the next letter to be drawn, based on the width of the current character.

 g.setColor(Color.black);
 g.setFont(font);
 FontMetrics fm = g.getFontMetrics();

Next, we’ll step through the blinkString, one letter at a time. For each letter, we’ll calculate a random value for red, green, and blue. We’ll store the current character in character, then calculate the character’s width.

 for (int index=0; index<blinkString.length(); index++ )
 {
 int red = (int)(Math.random() * 256);
 int green = (int)(Math.random() * 256);
 int blue = (int)(Math.random() * 256);
 
 char character = blinkString.charAt(index);
 int w = fm.charWidth(character);

We’ll set the current color using our random red, green, and blue values. Next, we’ll create a new Character object (note that Character is different from char - see java.lang.Character), which gives us an easy way to convert a single character to a string. We need a string to pass to drawString(), and the Character wrapper gives us an easy way to get there. If anyone out there can think of a simpler way to draw the character on the screen at the specified x and y location, please let me know. Just be sure you test your theory before you write!

Once we draw the character, we’ll bump x by the width of the character.

 g.setColor( new java.awt.Color( red, green, blue ) );
 
 Character c = new Character( character );
 g.drawString(c.toString(), x, y );
 x += w;
 }
 }

start() is similar to init(), but gets called when the applet’s document is visited. We’ll create a new Thread object and call its start() method. When the applet’s document is no longer on the screen, the stop() method is called. In our case, we’ll call the Thread’s stop() method to stop the thread.

 public void start()
 {
 blinkThread = new Thread(this);
 blinkThread.start();
 }

 public void stop()
 {
 blinkThread.stop();
 }

Remember that the run() method contains the body of the thread we are starting up. Our thread enters an infinite loop. The loop tries a sleep() for speed milliseconds. We catch the InterruptedException exception (which occurs when another Thread interrupts this thread), but we do nothing about it. The loop ends by forcing a repaint of the applet.

 public void run()
 {
 while (true)
 {
 try {Thread.currentThread().sleep(speed);}
 catch (InterruptedException e){}
 repaint();
 }
 }
}

Till Next Month...

This month’s applet introduced the concept of FontMetrics, type wrappers (in our case, java.lang.Character), and Threads, along with a quick tour of CodeWarrior’s Java environment. Next month, we’ll take a look at Peter Lewis’ rewrite of this applet. Think about how you might improve the design of this applet. What changes would you make? Peter’s changes were very interesting and definitely worth exploring. See you next month.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Apple High Sierra 10.13 - The latest OS...
macOS High Sierra introduces new core technologies that improve the most important functions of your Mac. From rearchitecting how it stores your data to improving the efficiency of video streaming to... Read more
ScreenFlow 7.1 - Create screen recording...
ScreenFlow is powerful, easy-to-use screencasting software for the Mac. With ScreenFlow you can record the contents of your entire monitor while also capturing your video camera, microphone and your... Read more
Airmail 3.5 - Powerful, minimal email cl...
Airmail is an mail client with fast performance and intuitive interaction. Support for iCloud, MS Exchange, Gmail, Google Apps, IMAP, POP3, Yahoo!, AOL, Outlook.com, Live.com. Airmail was designed... Read more
CleanMyMac 3.9.0 - $39.95
CleanMyMac makes space for the things you love. Sporting a range of ingenious new features, CleanMyMac lets you safely and intelligently scan and clean your entire system, delete large, unused files... Read more
Numi 3.17.2 - Menu-bar calculator suppor...
Numi is a calculator that magically combines calculations with text, and allows you to freely share your computations. Numi combines text editor and calculator Support plain English. For example, '5... Read more
OmniGraffle 7.4.3 - Create diagrams, flo...
OmniGraffle helps you draw beautiful diagrams, family trees, flow charts, org charts, layouts, and (mathematically speaking) any other directed or non-directed graphs. We've had people use Graffle to... Read more
ExpanDrive 6.1.0 - Access cloud storage...
ExpanDrive builds cloud storage in every application, acts just like a USB drive plugged into your Mac. With ExpanDrive, you can securely access any remote file server directly from the Finder or... Read more
VueScan 9.5.86 - Scanner software with a...
VueScan is a scanning program that works with most high-quality flatbed and film scanners to produce scans that have excellent color fidelity and color balance. VueScan is easy to use, and has... Read more
Cocktail 11.0 - General maintenance and...
Cocktail is a general purpose utility for macOS that lets you clean, repair and optimize your Mac. It is a powerful digital toolset that helps hundreds of thousands of Mac users around the world get... Read more
OmniGraffle Pro 7.4.3 - Create diagrams,...
OmniGraffle Pro helps you draw beautiful diagrams, family trees, flow charts, org charts, layouts, and (mathematically speaking) any other directed or non-directed graphs. We've had people use... Read more

Morphite guide - how to explore like a p...
The much anticipated space exploration game, Morphite, has finally arrived, and we can't get enough of it. The game is essentially everything we wanted No Man's Sky to be. It's a game that puts a heavy focus on exploring foreign worlds, but the... | Read more »
The best visual novels on mobile
Narrative games have been around for ages, but only now have they been creeping into the mainstream spotlight. These games tell some of the industry's finest stories, and they break new ground in terms of gameplay and mechanics regularly. Here are... | Read more »
The best new games we played this week -...
It's pretty much been one big release after another. We were privy to a bunch of surprises this week, with a lot of games we'd been waiting for quite some time dropping unexpectedly. We hope you're free this weekend, because there is a lot for... | Read more »
Stormbound: Kingdom Wars guide - how to...
Stormbound: Kingdom Wars is an excellent new RTS turned card battler out now on iOS and Android. Lovers of strategy will get a lot of enjoyment out of Stormbound's chess-like mechanics, and it's cardbased units are perfect for anyone who loves the... | Read more »
The best AR apps and games on iOS right...
iOS 11 has officially launched, and with it comes Apple's ARKit, a helpful framework that makes it easier than ever for developers to create mobile AR experiences. To celebrate the occassion, we're featuring some of the best AR apps and games on... | Read more »
Phoenix Wright: Ace Attorney - Spirit of...
Phoenix Wright: Ace Attorney - Spirit of Justice 1.00.00 Device: iOS Universal Category: Games Price: $.99, Version: 1.00.00 (iTunes) Description: ************************************************※IMPORTANT※・Please read the “When... | Read more »
Kpressor (Utilities)
Kpressor 1.0.0 Device: iOS Universal Category: Utilities Price: $4.99, Version: 1.0.0 (iTunes) Description: The ultimate ZIP compression application for iPhone and iPad. - Full integration of iOS 11 with support for multitasking.-... | Read more »
Find out how you can save £35 and win a...
Nothing raises excitement like a good competition, and we’re thrilled to announce our latest contest. We’ll be sending one lucky reader and a friend to the Summoners War World Arena Championship at Le Comedia in Paris on October 7th. It’s the... | Read more »
Another Lost Phone: Laura's Story...
Another Lost Phone: Laura's Story 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: Another Lost Phone is a game about exploring the social life of a young woman whose phone you have just... | Read more »
The Witness (Games)
The Witness 1.0 Device: iOS Universal Category: Games Price: $9.99, Version: 1.0 (iTunes) Description: You wake up, alone, on a strange island full of puzzles that will challenge and surprise you. You don't remember who you are, and... | Read more »

Price Scanner via MacPrices.net

Snag a Certified Refurbished Apple Pencil for...
Apple has Certified Refurbished Apple Pencils available for $85 including free shipping. Their price is $14 off MSRP, and it’s the lowest price available for a Pencil. Read more
12-inch 64GB iPad Pro on sale for $749, save...
Adorama has 12″ 64GB iPad Pros on sale today for $749 including free shipping plus NY & NJ sales tax only. Their price is $50 off MSRP. Read more
Apple Certified Refurbished iPad minis availa...
Apple has Certified Refurbished 128GB iPad minis available today for $339 including free shipping. Apple’s standard one-year warranty is included. Their price is $60 off MSRP. Read more
12-inch 1.2GHz Retina MacBook Pros on sale fo...
B&H Photo has 2017 12″ 1.2GHz Retina MacBooks on sale for $100 off MSRP. Shipping is free, and B&H charges sales tax in NY & NJ only: 12″ 1.2GHz Space Gray MacBook: $1199 $100 off MSRP 12... Read more
Sunday sale: 13-inch 3.1GHz MacBook Pros for...
Amazon has 2017 13″ 3.1GHz MacBook Pros on sale today for up to $150 off MSRP, each including free shipping: – 13″ 3.1GHz/256GB Space Gray MacBook Pro (MPXV2LL/A): $1649.99 $150 off MSRP – 13″ 3.1GHz... Read more
Looking for a 2017 12″ Retina MacBook? Save $...
Apple has Certified Refurbished 2017 12″ Retina MacBooks available for $200-$240 off the cost of new models. Apple will include a standard one-year warranty with each MacBook, and shipping is free.... Read more
Apple Offering Up To $455 Credit Toward iPhon...
iPhone 8 and 8 Plus are now available at the Apple Store, and you can receive up to $375 credit toward a new iPhone purchase when you trade in your eligible smartphone. Photo Courtesy Apple Just... Read more
AnyTrans Offers iOS Users Three Ways For Movi...
iMobie Inc. today announceed AnyTrans v6.0.1, which now can help iOS users move all data to iPhone 8/8 Plus seamlessly. The software is available both on Mac and Windows and fully able to move all... Read more
Snag a 13-inch 2.3GHz MacBook Pro for $100 of...
B&H Photo has 2017 13″ 2.3GHz MacBook Pros in stock today and on sale for $100 off MSRP, each including free shipping plus NY & NJ sales tax only: – 13-inch 2.3GHz/128GB Space Gray MacBook... Read more
Verizon offers new iPhone 8 for $100-$300 off...
Verizon is offering the new iPhone 8 for up to $300 off MSRP with an eligible trade-in: • $300 off: iPhone 6S/6S Plus/7/7 Plus, Google Pixel XL, LG G6, Moto Z2 Force, Samsung Galaxy S7/S7 edge/S8/S8... Read more

Jobs Board

Development Operations and Site Reliability E...
Development Operations and Site Reliability Engineer, Apple Payment Gateway Job Number: 57572631 Santa Clara Valley, California, United States Posted: Jul. 27, 2017 Read more
Data Engineer - *Apple* Media Products - Ap...
Job Summary Apple is seeking a highly skilled data engineer to join the Data Engineering team within Apple Media Products. AMP (home to Apple Music, App Read more
Development Operations and Site Reliability E...
Development Operations and Site Reliability Engineer, Apple Payment Gateway Job Number: 57572631 Santa Clara Valley, California, United States Posted: Jul. 27, 2017 Read more
Development Operations and Site Reliability E...
Development Operations and Site Reliability Engineer, Apple Payment Gateway Job Number: 57572631 Santa Clara Valley, California, United States Posted: Jul. 27, 2017 Read more
*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.