TweetFollow Us on Twitter

Java Popup
Volume Number:12
Issue Number:7
Column Tag:Getting Started

A Java Popup Menu URL Launcher

By Dave Mark

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

Since last month’s column, I’ve been consumed with Java. I’ve been reading every Java book I could get my hands on, including the galleys for Learn Java on the Macintosh (Addison-Wesley), Java in a Nutshell (O’Reilly & Associates), Active Java (Addison-Wesley), Java Essentials for C and C++ Programmers (Addison-Wesley), and Teach Yourself Java for Macintosh In 21 Days (Hayden). There are lots of Java books out there, some of them much better than others.

Beware of Java books written to pre-release versions of the Java SDK from Sun. Much has changed between the pre-release and release versions and, as a slew of messages on the net will attest, those changes will frustrate you as you attempt to get the book sample code to work.

The applets from Learn Java on the Macintosh and Java in a Nutshell have been translated into Metrowerks’ Java project format. You can download the applets from Metrowerks’ Web site (www.metrowerks.com).

This Month’s Applets

One important use of Java is to extend the functionality of a Web site, beyond the capabilities offered by HTML. If you’ve ever been to Netscape’s Web site, you’ve probably encountered the long list of download sites that allow you to download the latest version of a Netscape product (Figure 1).

If you’ve got a long list of URLs to put on your Web site, you can, of course, represent them just like Netscape did, as a long series of links. The downside to this approach is that the links can take up a fair amount of screen space. An alternative is to use a form CGI and represent the list as a popup menu of URLs.

Figure 1. The long list of sites to download the latest version of Netscape Navigator

Solving the problem using a CGI is fine, but I wanted to implement this “popup” solution as a Java applet instead. To do this, we need to take advantage of the existing Java applet model, as embodied in the java.applet.Applet class. To make this a little easier to understand, I developed the applet in two stages. Here’s the first version:

import java.applet.*;
import java.awt.*;
import java.net.*;

public class popup extends Applet
{
 private Choice  urlChoices;
 int    numURLs;
 
 public voidinit()
 {
 this.setBackground( Color.yellow );//java.awt.Color
 this.setForeground( Color.red );//java.awt.Color
 
 urlChoices = new Choice();
 
 urlChoices.addItem( "www.metrowerks.com" );
 urlChoices.addItem( "www.netscape.com" );
 urlChoices.addItem( "www.mactech.com" );
 
 urlChoices.setForeground( Color.green );
 urlChoices.setBackground( Color.blue );
 
 this.add( new Label( "Select URL: " ) );
 this.add( urlChoices );
 }
 
 public boolean action( Event e, Object obj )
 {
 URL    url;
 
 if ( e.target == urlChoices )
 {
 try
 {
 url = new URL( obj.toString() );
 }
 catch( MalformedURLException err )
 {
    // Could print error message here.
 return true;
 }
 this.getAppletContext().showDocument( url );
 return true;
 }
 else
 return super.action( e, obj );
 }
}

Since I’m using CodeWarrior, I started by creating a new project file called popup.µ using the Java applet stationery. Next, I created a new source code file named popup.java and added it to the project. I typed in my source code, saved it, then selected the .java file in the project window and compiled it. The compiler used my Java source code to produce a file named popup.class which contains the Java byte code that will be loaded by my HTML file.

Speaking of my HTML file, I used CodeWarrior to create a new file called popup.html and saved it in the same folder as my other project files. I didn’t add the HTML file to the project. Here’s the HTML:

<HTML>
<HEAD>
<TITLE>URL Launcher</TITLE>
</HEAD>
<BODY>
This applet creates a popup menu of URLs.
<H>R
<APPLET CODE="popup.class" WIDTH=300 HEIGHT=35>
</APPLET>
</BODY>
</HTML>

If you’ve never seen HTML before, it’s pretty straightforward. Basically, your HTML file contains the text you want to appear on your Web page, with a bunch of “tags” sprinkled throughout that define how the text looks. A tag is a pair of angle brackets that enclose a tag name, along with optional tag attributes. Some tags work in pairs. An end tag always starts with a '/'.

For example, to define the title of a particular page, you’ll start with the <title> tag, follow it with the title, then follow the text with the </title> tag. The <hr> tag places a horizontal rule on your page. Note that the <hr> tag doesn’t require a corresponding </hr> tag, since there is no text that needs to be surrounded. By the way, HTML tags are case-insensitive.

The <applet> tag is the tag we’re interested in in this column. The CODE attribute specifies the name of the class file we want launched. In this case, we want the Java byte codes in popup.class executed.

Drag the HTML file on top of your favorite Java applet runner. If you have a Java-capable browser (like Netscape Atlas), you can open the HTML file and see how your applet looks on an actual Web page. Alternatively, if you run the applet using an applet runner, you’ll see the applet portion of the Web page only. Most applet runners only understand the applet tag and will ignore the rest of the HTML.

Figure 2 shows the popup applet as viewed in an early beta of Netscape Atlas. As long as your Internet connection is live, selecting a URL from the popup menu transfers you to that URL.

Figure 2. Our popup applet in action

Let’s take a look at the source code...

The Popup.java Source Code

As I already mentioned, this applet extends the java.applet.Applet class. Go into the API Documentation folder that came with your development environment and use your Web browser to open the file java.applet.Applet.html. As you’ll see in the figure at the top of the page, java.applet.Applet is derived from java.awt.Panel, which is derived from java.awt.Container, which is derived from java.awt.Component. java.awt.Component is where all the action is. That’s where you’ll find all the interesting methods used by most applets. Spend a little quality time with java.awt.Component.html. It will definitely pay off.

The first few lines make the classes in java.applet.*, java.awt.*, and java.net.* available to our program. This allows us to refer to Applet instead of java.applet.Applet and URL instead of java.net.URL. You get the idea.

import java.applet.*;
import java.awt.*;
import java.net.*;

Our popup class extends the Applet class. We declare the variable urlChoices inside our class. urlChoices is a reference to a Choice (Java’s term for a popup menu).

public class popup extends Applet
{
 private Choice  urlChoices;

The first method in our applet is the init() method. init() will be called automatically when our applet is started up. We’ll use this method to set up our Choice popup menu. We’ll start off by setting the applet background color to yellow and the foreground color to red. Note that this refers to the applet. If you take a look at Figure 2, you’ll see that the background is yellow and that the popup menu’s label text is red. I know yellow and red might not be a particularly good looking combination, but it does make the point, right?

 public voidinit()
 {
 this.setBackground( Color.yellow );//java.awt.Color
 this.setForeground( Color.red );//java.awt.Color

The next line uses new to create a new Choice object. Note that urlChoices is set to null until the new Choice is created.

 urlChoices = new Choice();

Next, the Choice classes’ addItem() method is called to add three URLs to the project. The popup menu’s foreground and background colors are set, too, but these calls don’t seem to have any effect.

 urlChoices.addItem( "www.metrowerks.com" );
 urlChoices.addItem( "www.netscape.com" );
 urlChoices.addItem( "www.mactech.com" );
 
 urlChoices.setForeground( Color.green );
 urlChoices.setBackground( Color.blue );

Finally, a new Label object is created and the Label and Choice objects are added to the applet.

 this.add( new Label( "Select URL: " ) );
 this.add( urlChoices );
 }

The action() method is called whenever an event occurs that relates to the applet. We’ll declare a URL reference to hold the URL we want to transfer to.

 public boolean action( Event e, Object obj )
 {
 URL    url;

The Event object e contains the event description we are responding to. Check out java.awt.Event to get a sense of Java event handling. e.target specifies the target object of the event. If the target is our popup menu, urlChoices, we’ll handle the event. Otherwise, we’ll pass the event on to our superclass and return whatever value super.action() returns.

If urlChoices was the target, we’ll try creating a new URL object. Some Java objects require that you catch exceptions thrown by the object. To get a sense of this, go to the java.net.URL.html page. Note that all of the constructors throw the MalformedURLException error. You must catch this exception or your code won’t compile. We ignore the error, but we could print an error message or, better yet, put up a dialog letting users know that the URL they selected isn’t quite right.

If you throw an exception, you’ll create a new java.lang.exception object (or some class that extends throwable). But when you catch an exception, the exception object is passed to your catch block, as err was in this case. Take a look at java.lang.Throwable.html, especially the getMessage() method.

 if ( e.target == urlChoices )
 {
 try
 {

Since the event target is our popup menu, the object will be the menu itself. By calling the method toString() (inherited from Object), we’ll get a string with the popup menu’s current setting. We’ll then use that string to initialize the URL.

 url = new URL( obj.toString() );
 }
 catch( MalformedURLException err )
 {
 // Could print error message here.
 return true;
 }

Assuming the URL object was created okay, we’ll call getAppletContext() to get our applet’s context, then use that object to call showDocument(), which will tell our browser to jump to a different URL.

 this.getAppletContext().showDocument( url );
 return true;
 }
 else
 return super.action( e, obj );
 }
}

Same Applet, Using Parameters

Here’s a second version of the applet that gets its URLs from the HTML file. To see how this works, take a look at the second version of our HTML file:

<HTML>
<HEAD>
<TITLE>URL Launcher</TITLE>
</HEAD>
<BODY>
This applet takes a series of parameters and turns them into a popup 
menu of URLs. The PARAM with the name numURLs tells you how many URLs 
are included. PARAM "1" contains the 1st URL, PARAM "2" contains the 
next URL, etc.
<H>R
<APPLET code="popup.class" width=300 height=35>
<PARAM name="numURLs" value="3">
<PARAM name="1" value="http://www.metrowerks.com">
<PARAM name="2" value="http://www.mactech.com">
<PARAM name="3" value="http://www.netscape.com">
</APPLET>
</BODY>
</HTML>

Notice that we’ve added a series of <PARAM> tags between the <APPLET> and </APPLET> tags. Each PARAM passes a named parameter to our applet. The numURLs parameter tells our applet how many URLs we are passing in. The 1 parameter contains the first URL, 2 contains the second URL, etc.

Here’s the second version of our applet:

import java.applet.*;
import java.awt.*;
import java.net.*;

public class popup extends Applet
{
 private Choice  urlChoices;
 
 public voidinit()
 {
 int    numURLs = 0;
 
 this.setBackground( Color.yellow );//java.awt.Color
 this.setForeground( Color.red );//java.awt.Color
 
 urlChoices = new Choice();
 
 urlChoices.setForeground( Color.green );
 urlChoices.setBackground( Color.blue );
 
 String numURLsString = this.getParameter( "numURLs" );
 
 if ( numURLsString == null )
 {
 this.showStatus( "null or missing numURLs Parameter!" );
 }
 else
 {
 try
 {
 numURLs = Integer.parseInt( numURLsString );
 }
 catch( NumberFormatException err )
 {
 numURLs = 0;
 this.showStatus( "Bad numURLs Parameter: " +                  
   numURLsString );
 }
 
 String urlString;
 
 for ( int i=1; i<=numURLs; i++ )
 {
 urlString = this.getParameter( Integer.toString( i ) );
 
 if ( urlString == null )
 this.showStatus( "Missing Parameter: " + i );
 else
 urlChoices.addItem( urlString );
 }
 }
 
 this.add( new Label( "Select URL: " ) );
 this.add( urlChoices );
 }
 
 public boolean action( Event e, Object obj )
 {
 URL    url;
 
 if ( e.target == urlChoices )
 {
 try
 {
 url = new URL( obj.toString() );
 }
 catch( MalformedURLException err )
 {
    // Could print error message here.
 return true;
 }
 this.getAppletContext().showDocument( url );
 return true;
 }
 else
 return super.action( e, obj );
 }
}

Basically, the difference here is in this chunk of code from init():

 String numURLsString = this.getParameter( "numURLs" );
 
 if ( numURLsString == null )
 {
 this.showStatus( "null or missing numURLs Parameter!" );
 }
 else
 {
 try
 {
 numURLs = Integer.parseInt( numURLsString );
 }
 catch( NumberFormatException err )
 {
 numURLs = 0;
 this.showStatus( "Bad numURLs Parameter: " +                  
  numURLsString );
 }
 
 String urlString;
 
 for ( int i=1; i<=numURLs; i++ )
 {
 urlString = this.getParameter( Integer.toString( i ) );
 
 if ( urlString == null )
 this.showStatus( "Missing Parameter: " + i );
 else
 urlChoices.addItem( urlString );
 }
 }
 
 this.add( new Label( "Select URL: " ) );
 this.add( urlChoices );

We start by calling getParameter() to retrieve the numURLs parameter. If the parameter is missing, we call showStatus() to display an error message in the browser’s status message area. If the parameter was there, we’ll try parsing an integer value from the string, placing the value in numURLs. Assuming we get a proper number, we’ll step from 1 to numURLs.

Inside the loop, we’ll convert the current index into a string (using Integer.toString()) and pass that string into getParameter(). If that parameter exists, we’ll add that parameter into the popup menu.

Till Next Month...

Want more Java? Want more PowerPlant? Want some TCL? What the heck do you want? Send me some email. Let me know. Otherwise, I’ll just keep writing about Java until I get sick of it! <g> By the way, I hope that you will take a moment and visit www.zumacafe.com, the Web site for a brand new internet cafe in Santa Fe, New Mexico. Zuma’s is the brainchild of Robin Williams, a brilliant writer and someone who has given a great deal to the Macintosh community. Check out the site and, if you get to Santa Fe, drop by Zuma’s and say hello!

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Together 3.7 - Store and organize all of...
Together helps you organize your Mac, giving you the ability to store, edit and preview your files in a single clean, uncluttered interface. Features Smart storage. With simple drag-and-drop... Read more
EtreCheck 3.1.4 - For troubleshooting yo...
EtreCheck is an app that displays the important details of your system configuration and allow you to copy that information to the Clipboard. It is meant to be used with Apple Support Communities to... Read more
Postbox 5.0.9 - Powerful and flexible em...
Postbox is a new email application that helps you organize your work life and get stuff done. It has all the elegance and simplicity of Apple Mail, but with more power and flexibility to manage even... Read more
DiskCatalogMaker 6.5.16 - Catalog your d...
DiskCatalogMaker is a simple disk management tool which catalogs disks. Simple, light-weight, and fast. Finder-like intuitive look and feel. Super-fast search algorithm. Can compress catalog data... Read more
TrailRunner 3.8.827 - Route planning for...
TrailRunner is the perfect companion for runners, bikers, hikers, and all people wandering under the sky. Plan routes on a geographical map. Import GPS or workout recordings and journalize your... Read more
VueScan 9.5.61 - 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
Postbox 5.0.9 - Powerful and flexible em...
Postbox is a new email application that helps you organize your work life and get stuff done. It has all the elegance and simplicity of Apple Mail, but with more power and flexibility to manage even... Read more
VueScan 9.5.61 - 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
DiskCatalogMaker 6.5.16 - Catalog your d...
DiskCatalogMaker is a simple disk management tool which catalogs disks. Simple, light-weight, and fast. Finder-like intuitive look and feel. Super-fast search algorithm. Can compress catalog data... Read more
TrailRunner 3.8.827 - Route planning for...
TrailRunner is the perfect companion for runners, bikers, hikers, and all people wandering under the sky. Plan routes on a geographical map. Import GPS or workout recordings and journalize your... Read more

Latest Forum Discussions

See All

Amateur Surgeon 4 Guide: Become the worl...
It's time to wield your trusty pizza cutter again, as Amateur Surgeon has returned with a whole fresh set of challenges (and some old, familiar ones, too). Starting anew isn't easy, especially when all you have at your disposal is a lighter, the... | Read more »
Le Parker: Sous Chef Extraordinaire (Ga...
Le Parker: Sous Chef Extraordinaire 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: | Read more »
Telltale Games really is working on a Gu...
Telltale Games' next episodic adventure is indeed Guardians of the Galaxy. A document tied to the voice actors strike suggested that the project was in the work, but now we have direct confirmation following an announcement at the Game Awards that... | Read more »
Amateur Surgeon returns to iOS and Andro...
Amateur Surgeon and its two sequels disappeared from the App Store some time and it was sad days for all. But now, just in time for the holidays, the Adult Swim favorite makes its joyous return in the shape of Amateur Surgeon 4, a remake with... | Read more »
The best board games on mobile
Sometimes you need to ditch all of the high speed, high action games in favor of something a little more traditional. If you don't feel like parting ways from your mobile device, though, there are still plenty of ways to get that old-school fix.... | Read more »
The best Facebook Messenger Instant Game...
Facebook's new Instant Games is now here, meaning you can play games with your friends directly via Facebook. It's a fun new way to connect with friends, of course, but it's also proving to be a solid gaming experience in its own right, with a... | Read more »
You can now play game's on Facebook...
Facebook launched its new Instant Games platform in an exciting new attempt to engage its user base. As a result, you can now play a number of different games directly through Facebook Messenger. All of these games run with HTML5, meaning you play... | Read more »
Apollo Justice Ace Attorney (Games)
Apollo Justice Ace Attorney 1.00.00 Device: iOS Universal Category: Games Price: $.99, Version: 1.00.00 (iTunes) Description: Court Is Back In Session Star as rookie defense attorney, Apollo Justice, as he visits crime scenes,... | Read more »
KORG iWAVESTATION (Music)
KORG iWAVESTATION 1.0 Device: iOS Universal Category: Music Price: $19.99, Version: 1.0 (iTunes) Description: A revolutionary new world of sound.The Wave Sequence Synthesizer for iPad - KORG iWAVESTATION | Read more »
Don't Grind Guide: Tips for becomin...
Don’t Grind is a surprising, derpy little one touch game with fun hand-drawn graphics. The goal is simple -- get the high score without being chopped to bits. That can be tough when you’re not used to the game, and that’s compounded by the fact... | Read more »

Price Scanner via MacPrices.net

Monday roundup of Holiday Mac sales: Up to $3...
Take up to $300 off MSRP on the price of a new Apple Mac at B&H Photo today as part of their Holiday sale. Shipping is free, and B&H charges NY sales tax only. Touch Bar MacBook Pros are in... Read more
12-inch WiFi Apple iPad Pros on sale for up t...
B&H Photo has 12″ WiFi Apple iPad Pros on sale for up to $50 off MSRP, each including free shipping. B&H charges sales tax in NY only: - 12″ Space Gray 32GB WiFi iPad Pro: $749 $50 off MSRP... Read more
9-inch Apple WiFi iPad Pros on sale for $20-$...
B&H Photo has 9.7″ Apple WiFi iPad Pros on sale for $20-$50 off MSRP, each including free shipping. B&H charges sales tax in NY only: - 9″ Space Gray 256GB WiFi iPad Pro: $779.95 $20 off MSRP... Read more
Holiday sale: Apple MacBook Airs available fo...
B&H Photo has 13″ MacBook Airs on sale for $100 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 13″ 1.6GHz/128GB MacBook Air (MMGF2LL/A): $899 $100 off MSRP - 13″ 1.6GHz/... Read more
13-inch Silver Touch Bar MacBook Pro in stock...
Amazon has the new 2016 13″ 2.9GHz/256GB Silver Touch Bar MacBook Pro (MLVP2LL/A) in stock today and on sale for $1749 including free shipping. That’s $50 off MSRP, and it’s the lowest price... Read more
Parallels Toolbox 1.3 for Mac Offers 25 Singl...
Parallels has launched Parallels Toolbox 1.3 for Mac, an upgrade that adds five new utilities to the stand-alone application which was released in August and is available exclusively online at http... Read more
OWC Mercury Elite Pro Dual mini Ultra-Portabl...
OWC has introduced the new OWC Mercury Elite Pro Dual mini, a powerful yet ultra-portable dual-drive RAID solution. The new Mercury Elite Pro Dual mini packs phenomenal performance into a small... Read more
Clearance 13-inch Retina MacBook Pros availab...
B&H Photo has clearance 2015 13″ Retina Apple MacBook Pros available for up to $200 off original MSRP. Shipping is free, and B&H charges NY tax only: - 13″ 2.7GHz/128GB Retina MacBook Pro: $... Read more
Roundup of 2016 13-inch 2.0GHz MacBook Pro sa...
B&H has the non-Touch Bar 13″ MacBook Pros in stock today for $50-$100 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 13″ 2.0GHz MacBook Pro Space Gray (MLL42LL/A): $1449 $... Read more
New 13-inch 2.0GHz Space Gray MacBook Pro in...
Adorama has the new 13″ 2.0GHz Space Gray MacBook Pro (non-Touch Bar, MLL42LL/A) in stock for $1499 including a free 3-year AppleCare Protection Plan. Shipping is free, and Adorama charges sales tax... Read more

Jobs Board

Lead *Apple* Solutions Consultant - Apple (...
# Lead Apple Solutions Consultant Job Number: 53586123 Pittsburgh, Pennsylvania, United States Posted: Nov. 28, 2016 Weekly Hours: 40.00 **Job Summary** The Lead ASC Read more
*Apple* Retail - Multiple Positions- Plano,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Retail - Multiple Positions- Kansas...
Job Description:SalesSpecialist - Retail Customer Service and SalesTransform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Retail - Multiple Positions- Chicago...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
Hardware Design Validation Engineer - *Apple...
The Apple Watch team is looking for a Hardware Design Validation Engineer. This person will be part of the Apple Watch hardware team with responsibilities for Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.