54
|
Chapter 1, Basic JComponents
#12 Add Translucence to Menus
HACK
No constructor is required because all UI classes have a no-arg constructor
automatically. All UI classes also need a static
createUI( ) method to create a
new instance of the class, as you can see in the example. In the
paint( )
method, instead of drawing on the graphics object passed in, the code cre-
ates a buffered image with the same dimensions as the component, and then
calls
super.paint( )
. This will draw the component onto the buffered image
instead of the screen. Once the painting is done, it can apply a transform and
then draw the image buffer onto the real
Graphics. In this case, the trans-
form is an alpha composite of
0.8. This means that instead of drawing the
buffer as is, it will draw the buffer partially transparent (80% solid, in this
case). This will draw the
bufferedimage into the real graphics with a translu-
cent effect. You can vary the strength of the translucency by modifying the
second parameter to the
AlphaComposite.getInstance( ) method (1 results in
a solid,
0 is totally transparent).
Add a Custom JMenu
If you stopped with just the custom menu items, the menus would seem a
bit translucent, but the rest of the window wouldn’t shine through. This is
because the menu items are inside of another component; in fact, they’re
inside of three! The
JMenu puts all of the menu items inside of a JPopupMenu,
which is placed inside of a
JPanel, and then the whole deal is put in a lay-
ered pane at the top of the frame. The layered pane is already transparent, so
you don’t need to worry about it, but the
JPanel and JPopupMenu are going to
be a problem. Example 1-29 handles the custom UI for these.
Example 1-29. Handling translucence for JPanels and JPopupMenus
public class CustomPopupMenuUI extends BasicPopupMenuUI {
public static ComponentUI createUI(JComponent c) {
return new CustomPopupMenuUI( );
}
public void installUI(JComponent c) {
super.installUI(c);
popupMenu.setOpaque(false);
}
public Popup getPopup(JPopupMenu popup, int x, int y) {
Popup pp = super.getPopup(popup,x,y);
JPanel panel = (JPanel)popup.getParent( );
panel.setOpaque(false);
return pp;
}
}

Get Swing Hacks now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.