import java.awt.AWTEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JComponent; import javax.swing.JMenu; import javax.swing.UIDefaults; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.BevelBorder; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicMenuUI; public class RolloverMenu extends JMenu { private UIDefaults defaults = UIManager.getLookAndFeelDefaults(); private boolean selected; private Border rolloverBorder; private Border raisedBorder; private Border loweredBorder; public RolloverMenu(String s) { super(s); setUI(RolloverMenuUI.createUI(this)); rolloverBorder = createRolloverBorder(); raisedBorder = createRaisedBevelBorder(); loweredBorder = createLoweredBevelBorder(); setBorder(createRolloverBorder()); enableEvents(AWTEvent.MOUSE_EVENT_MASK); } public void processMouseEvent(MouseEvent event) { if (contains(event.getX(), event.getY())) { if (selected) { setBorder(loweredBorder); } else { setBorder(raisedBorder); } } else { if (!selected) { setBorder(rolloverBorder); } } super.processMouseEvent(event); } public void fireMenuSelected() { selected = true; setBorder(loweredBorder); super.fireMenuSelected(); } public void fireMenuCanceled() { deselected(); super.fireMenuCanceled(); } public void fireMenuDeselected() { deselected(); super.fireMenuDeselected(); } private void deselected() { selected = false; setBorder(rolloverBorder); } private Border createRolloverBorder() { return new CompoundBorder(new EmptyBorder(2, 2, 3, 2), new EmptyBorder(3, 3, 3, 3)); } private Border createLoweredBevelBorder() { return new CompoundBorder(new BevelBorder(BevelBorder.LOWERED, defaults.getColor("Button.light"), defaults.getColor("Button.highlight"), defaults.getColor("Button.shadow"), defaults.getColor("Button.darkShadow")), new EmptyBorder(3, 3, 3, 3)); } private Border createRaisedBevelBorder() { return new CompoundBorder(new BevelBorder(BevelBorder.RAISED, defaults.getColor("Button.light"), defaults.getColor("Button.highlight"), defaults.getColor("Button.shadow"), defaults.getColor("Button.darkShadow")), new EmptyBorder(3, 3, 3, 3)); } public static class RolloverMenuUI extends BasicMenuUI { public static ComponentUI createUI(JComponent c) { return new RolloverMenuUI(); } protected void installDefaults() { super.installDefaults(); selectionBackground = UIManager.getLookAndFeelDefaults().getColor("Button.background"); } } }