import java.awt.AWTEvent; import java.awt.AlphaComposite; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.event.MouseEvent; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.MenuElement; import javax.swing.RepaintManager; import org.jdesktop.animation.timing.Animator; import org.jdesktop.animation.timing.TimingTarget; import org.jdesktop.animation.timing.TimingTargetAdapter; public class WaftMenuBar extends JMenuBar { private AlphaComposite ac; private Animator fadein; private Animator fadeout; public WaftMenuBar() { ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.0f); TimingTarget target = new TimingTargetAdapter() { public void timingEvent(float fraction) { ac = ac.derive(fraction); repaint(); } }; fadein = new Animator(1000, target); fadeout = new Animator(1000, target); fadeout.setDirection(Animator.Direction.BACKWARD); enableEvents(AWTEvent.MOUSE_EVENT_MASK); RepaintManager.setCurrentManager(new FullRepaintManager()); TimingTarget t = new TimingTargetAdapter() { public void timingEvent(float fraction) { if (!isSubElementsVisible()) { fade(fadein, fadeout); } } }; Animator animator = new Animator(Animator.INFINITE, t); animator.setStartDelay(5000); animator.start(); } private boolean isSubElementsVisible() { Point pp = getMousePosition(); if (pp != null && contains(pp)) { return true; } for (MenuElement element: getSubElements()) { JMenu menu = (JMenu)element; if (menu.isPopupMenuVisible()) { return true; } } return false; } public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setComposite(ac); super.paint(g); } protected void processMouseEvent(MouseEvent event) { if (event.getID() == MouseEvent.MOUSE_ENTERED) { fade(fadeout, fadein); } } private void fade(Animator end, Animator begin) { if (end.isRunning()) { end.stop(); } if (begin.isRunning()) { return; } float fraction = ac.getAlpha(); begin.setInitialFraction(fraction); begin.start(); } }