He creado un menú desplegable en mi Swing JToolBar. Pero no crea comportarse de la manera que quiero. Mi objetivo es que funcione como el botón "Marcadores Inteligentes" de Firefox.¿Cómo puedo crear un menú "desplegable" en una barra de herramientas Java Swing?
Desaparece cuando el usuario selecciona un elemento de menú: ¡CORRECTO!
Desaparece cuando el usuario presiona ESC: ¡CORRECTO!
Desaparece cuando el usuario hace clic en algún lugar en el marco principal fuera del menú: ¡CORRECTO!
Pero no desaparece cuando el usuario hace clic una segunda vez en el botón que muestra el menú desplegable: INCORRECTO ... :-(
Mi pregunta es ¿cómo puedo agregar este comportamiento, que que no desaparecen cuando los clics en el botón que muestra el menú una segunda vez
Aquí está mi código actual, desde Java 6 en el Mac:.
import javax.swing.*;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class ScratchSpace {
public static void main(String[] arguments) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("Toolbar with Popup Menu demo");
final JToolBar toolBar = new JToolBar();
toolBar.add(createMoreButton());
final JPanel panel = new JPanel(new BorderLayout());
panel.add(toolBar, BorderLayout.NORTH);
panel.setPreferredSize(new Dimension(600, 400));
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
private static AbstractButton createMoreButton() {
final JToggleButton moreButton = new JToggleButton("More...");
moreButton.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
createAndShowMenu((JComponent) e.getSource(), moreButton);
}
}
});
moreButton.setFocusable(false);
moreButton.setHorizontalTextPosition(SwingConstants.LEADING);
return moreButton;
}
private static void createAndShowMenu(final JComponent component, final AbstractButton moreButton) {
JPopupMenu menu = new JPopupMenu();
menu.add(new JMenuItem("Black"));
menu.add(new JMenuItem("Red"));
menu.addPopupMenuListener(new PopupMenuListener() {
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
moreButton.setSelected(false);
}
public void popupMenuCanceled(PopupMenuEvent e) {
moreButton.setSelected(false);
}
});
menu.show(component, 0, component.getHeight());
}
}
Funciona como un encanto ... Una pregunta: ¿cómo se enteró de esta solución? Está documentado en alguna parte? –
En realidad, solo estaba usando mi depurador (con el src JDK adjunto) para averiguar dónde y cuándo se activaban los eventos. Lo encontré en BasicPopupMenuUI. – BryanD