Some reader favorites:
EJB fundamentals and session beans
Create a scrollable virtual desktop in Swing
More action with Struts 2
In a recent review of Struts 2 in Action, JW Blogger Oleg Mikheev notes that Struts 2 is "just a collection of extensions built upon WebWork, which is ultimately
the right thing to learn before starting a Struts 2 project." While Struts 2 has some architectural flaws, Oleg calls WebWork
well-designed, well-tested, and reliable. What are your experiences using Struts 2 and WebWork?
Also see "Hello World the WebWork way," a JavaWorld excerpt from WebWork in Action, by Patrick Lightbody and Jason Carreira.
| Memory Analysis in Eclipse |
| Enterprise AJAX - Transcend the Hype |
AffineTransforms, that arbitrary paths can be constructed and shapes filled using GeneralPaths, and that text strings are drawn and operated on just like any other shape in Java 2D. This month, I'll continue the discussion
by presenting the solution to last month's aliasing problem. I'll also illustrate how to use one shape to clip another, and delve into the new image-manipulation capabilities provided by Java.Aliasing occurs when a signal (in this case, a 2D graphics signal) is sampled and quantized from a continuous space into a discretized space. Sampling is the process of reading a value from a continuously varying signal. Quantization is the process by which these continuous sampled values are assigned a discrete value in the finite space represented by digital (binary-based) systems.
Aliasing is a by-product of this quantization. Humans perceive this by-product visually as abrupt changes in color from pixel to pixel. Graphics professionals often refer to these jagged edges as jaggies.
In general, aliasing is a bad thing. It leads to lower-quality signals of all kinds. In fact, if you look closely at the examples in last month's column, especially those with slanted and curved edges, you can see aliasing effects all the way back to Example02. (Example01's lines are drawn parallel and perpendicular to the scan-line direction of the computer screen, so there are no quantization errors.)
If you are not familiar with aliasing effects, you can refer to any decent graphics or signal processing textbook for much more in-depth information. Charles Poynton's A Technical Introduction to Digital Video (John Wiley & Sons; ISBN: 047112253X) gives a particularly good description of aliasing as it pertains to video signals. If you are familiar with aliasing, but would like a quick refresher, see the Resources section for a link to "The Truth about Antialiasing" by Jonathan Knudsen.
So, how do you handle aliasing? Java 2D lets you set one of several rendering hints to indicate that you would like for your 2D graphics to be drawn using antialiasing algorithms -- which smoothes the edges. Note that I said hints: Whichever Java 2D implementation you're using, it is allowed to decide whether or not to follow the hint and carry out the antialiasing as requested.
Let's compare the aliased output from last month's Example04 to some antialiased output, generated from Example05.
001 /**
002 * In previous examples, we saw some jagged edges due to aliasing.
003 * Example05 illustrates how to use rendering hints to request
004 * an anti-aliased render from Graphics2D.
005 **/
006 public void paint(Graphics g) {
007 Graphics2D g2d = (Graphics2D) g;
008
009 //This time, we want to use anti-aliasing if possible
010 //to avoid the jagged edges that were so prominent in
011 //our last example. With ask the Java 2D rendering
012 //engine (Graphics2D) to do this using a "rendering hint".
013 g2d.setRenderingHints(Graphics2D.ANTIALIASING,
014 Graphics2D.ANTIALIAS_ON);
015
016 //We reuse our GeneralPath filled shape. We translate
017 //and rotate this shape as we did before.
018 GeneralPath path = new GeneralPath(GeneralPath.EVEN_ODD);
019 path.moveTo(0.0f,0.0f);
020 path.lineTo(0.0f,125.0f);
021 path.quadTo(100.0f,100.0f,225.0f,125.0f);
022 path.curveTo(260.0f,100.0f,130.0f,50.0f,225.0f,0.0f);
023 path.closePath();
024
025 AffineTransform at = new AffineTransform();
026 at.setToRotation(-Math.PI/8.0);
027 g2d.transform(at);
028 at.setToTranslation(0.0f,150.0f);
029 g2d.transform(at);
030
031 g2d.setColor(Color.green);
032 g2d.fill(path);
033
034 Font exFont = new Font("TimesRoman",Font.PLAIN,40);
035 g2d.setFont(exFont);
036 g2d.setColor(Color.black);
037 g2d.drawString("JavaWorld",0.0f,0.0f);
038 }
The effects of the antialiasing are shown below.

Antialiasing renders graphics with smoother edges.
You request antialiased rendering by calling Graphics2D.setRenderingHints(Graphics2D.ANTIALIASING,Graphics2D.ANTIALIAS_ON) (lines 013 and 014). Antialiasing and the other rendering hints are discussed in more detail in the Java 2D API javadoc documentation.
So if aliasing is always bad, and antialiasing algorithms are available (assuming your Java runtime environment supports the rendering hint), then why not just perform antialiasing calculations all the time? The simple answer is performance. Antialiasing algorithms take longer to compute than their less-complicated aliasing brethren, slowing down your rendering times. Example05 is noticeably slower than Example04 on most current Pentium PC-class machines, though it still renders in a few hundred milliseconds.
In applications that render something only once, or rather infrequently, and where rendering speed is not particularly important, you should probably turn on the antialiasing hint to get better renders. Such applications include CAD systems and image manipulation tools. However, if an applications requires the fastest possible rendering speed, and aliasing will be less noticeable, antialiasing is undesirable. In twitch video games, for example, fast renders are much more important than jagged edges. As with many programming and engineering details, you as the application programmer need to understand the requirements of your problem domain and decide what is best for your particular application.
If it makes sense for your application, you could even leave the decision to the end user. For a CAD application, for instance, you could provide a switch to turn antialiasing on and off, depending on the user's needs. This switch would let the user change the rendering hints at runtime and then automatically repaint the graphics.
Last month I told you that any text string can be used as a Shape. This allows you to perform several interesting graphics manipulations with text. One of the more useful of these manipulations
is clipping.
Clipping allows you to use a specified path as a sort of stencil set on top of previously laid graphics. Java 2D supports
clipping using any arbitrary Shape. You can clip with shapes you draw yourself, including shapes you create using a GeneralPath. Because you can use StyledString.getStringOutline() to get the Shape for a string of text, you can also clip with that text.
TextLayout for internationalization support in the 1.2 Java platform. Accompanied by excellent illustrations that help to simplify the
more convoluted concepts in the text. http://www.ibm.com/java/education/international-text/
Font.properties file. http://www.alumni.caltech.edu/~dank/javafont.htm