O'Reilly logo

Swing Hacks by Chris Adamson, Joshua Marinacci

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

Make Your Frame Dissolve #42
Chapter 6, Transparent and Animated Windows
|
223
HACK
Create a Genie Effect
One of my favorite bits of eye candy from Mac OS X is the minimize dis-
solve. When you click on the minimize button in any application, the win-
dow will shrink and slide into the dock. This is called the genie effect, and it
not only looks cool, but it also gives you feedback about where a window
has gone. Example 6-3 is a subclass of
Dissolver that overrides the paint( )
method to create a spinning, shrinking window that somewhat mimics the
genie effect.
Example 6-2. A simple test class
public class DissolveHack {
public static void main(String[] args) {
final JFrame frame = new JFrame("Dissolve Hack");
JButton quit = new JButton("Quit");
quit.addActionListener(new ActionListener( ) {
public void actionPerformed(ActionEvent evt) {
new Dissolver( ).dissolveExit(frame);
}
});
frame.getContentPane( ).add(quit);
frame.pack( );
frame.setLocation(300,300);
frame.setSize(400,400);
frame.setVisible(true);
}
}
Example 6-3. Adding a genie effect to your toolbox
class SpinDissolver extends Dissolver {
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
// draw the screen, offset in case the window isn't at 0,0
g.drawImage(screen_buffer,-fullscreen.getX( ),
-fullscreen.getY( ),null);
// save the current transform
AffineTransform old_trans = g2.getTransform( );
// move to the upper-lefthand corner of the frame
g2.translate(frame.getX(), frame.getY( ));
// move the frame off toward the left
g2.translate(-((count+1) * (frame.getX()+frame.getWidth( ))/20),0);
224
|
Chapter 6, Transparent and Animated Windows
#42 Make Your Frame Dissolve
HACK
This dissolver will shrink the window and spin it, while moving it toward
the left at the same time. This make the window look like it is spinning off
into oblivion, as in Figure 6-5.
This hack shows off just a few of the really cool effects you can accomplish
with just a bit of Java2D code in your Swing application. Because the parent
Dissolve class takes care of most of the tricky parts, you can easily create
your own subclasses that focus on just the animation itself. You might want
to try some other animations, such as the circle and linear wipes common to
old movies, or a better genie effect that works when you quit your applica-
tion. Java2D gives you the power to do virtually any linear transform (shear,
scale, rotate, etc.), plus composites and convolutions. For even more effects,
you could use Java3D or JOGL to create three-dimensional effects like spin-
ning cubes and perspective transforms.
// shrink the frame
float scale = 1f / ((float)count+1);
g2.scale(scale,scale);
// rotate around the center
g2.rotate(((float)count)/3.14/1.3,
frame.getWidth()/2, frame.getHeight( )/2);
// finally draw the frame
g2.drawImage(frame_buffer,0,0,null);
// restore the current transform
g2.setTransform(old_trans);
}
}
Figure 6-5. A spin dissolve
Example 6-3. Adding a genie effect to your toolbox (continued)

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required