package org.limewire.ui.swing.components; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JComponent; import javax.swing.Timer; /** * This mouse listener is intended to hide the supplied component after the mouse * has left the scope of all JComponents this this instance has been added as a * listener to. */ public final class ComponentHider extends MouseAdapter { private final JComponent component; private final AdditionalBehavior additionalBehavior; private final Timer hideTimer = new Timer(200, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { if (component.isVisible()) { component.setVisible(false); if (additionalBehavior != null) { additionalBehavior.componentHidden(); } } } finally { ((Timer)e.getSource()).stop(); } } }); public ComponentHider(JComponent menu) { this(menu, null); } public ComponentHider(JComponent menu, AdditionalBehavior additionalBehavior) { this.component = menu; this.additionalBehavior = additionalBehavior; } @Override public void mouseEntered(MouseEvent e) { hideTimer.stop(); } @Override public void mouseExited(MouseEvent e) { hideTimer.start(); } /** * Callback to allow additional behavior to happen after the component has been hidden. */ public static interface AdditionalBehavior { void componentHidden(); } }