2009-11-07 25 views
32

Quiero crear una barra de herramientas en mi aplicación. Si hace clic en un botón en esa barra de herramientas, aparecerá un menú, al igual que en la barra de herramientas de Eclipse. No sé cómo hacer esto en Swing. ¿Puede alguien ayudarme por favor? Probé con Google pero no encontré nada.¿Cómo crear un JButton con un menú?

Respuesta

30

Esto es mucho más difícil en Swing de lo necesario. Entonces, en lugar de apuntarle a tutoriales, he creado un ejemplo completamente funcional.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

public class ToolbarDemo { 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     frame.setPreferredSize(new Dimension(600, 400)); 
     final JToolBar toolBar = new JToolBar(); 

     //Create the popup menu. 
     final JPopupMenu popup = new JPopupMenu(); 
     popup.add(new JMenuItem(new AbstractAction("Option 1") { 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(frame, "Option 1 selected"); 
      } 
     })); 
     popup.add(new JMenuItem(new AbstractAction("Option 2") { 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(frame, "Option 2 selected"); 
      } 
     })); 

     final JButton button = new JButton("Options"); 
     button.addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       popup.show(e.getComponent(), e.getX(), e.getY()); 
      } 
     }); 
     toolBar.add(button); 

     frame.getContentPane().add(toolBar, BorderLayout.NORTH); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

He estado haciendo algo como esto, pero sin JToolBar. ¿Su solución tiene el comportamiento de que si vuelve a hacer clic en el botón con el menú desplegable, aparece el menú nuevamente, en lugar de descartarlo? –

+2

También hice algo ligeramente diferente: popup.show (c, 0, c.getHeight()); –

+0

Gracias. Esta es la solución más fácil de entender que he encontrado, así que la usaré aunque no sea exactamente un Dropdown JButton. Las otras soluciones son demasiado complicadas para que las pueda entender. He enumerado algunos de ellos a continuación. Dikei

2

Creo que es lo mismo que en AWT.

Debe poner un ActionCommand en ese botón y cuando se ejecuta, muestre el menú emergente de acuerdo con las coordenadas del mouse.

2

Consulte la sección Arranque de una Menú emergente, en How to Use Menus.

+0

sólo que este es el vínculo más específico: http://docs.oracle.com/javase/tutorial/uiswing/components/menu .html # popup – pratikabu

14

no veo por qué esto es más difícil de lo que debe ser o por qué se debe utilizar un MouseListener. La solución de Steve McLeod funciona, pero donde aparece el menú depende de dónde se hizo clic en el mouse. ¿Por qué no usar simplemente un ActionListener como se usa normalmente para un JButton? No parece ser más difícil ni menos difícil.

final JPopupMenu menu = new JPopupMenu(); 
menu.add(...whatever...); 

final JButton button = new JButton(); 
button.setText("My Menu"); 
button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent ev) { 
     menu.show(button, button.getBounds().x, button.getBounds().y 
      + button.getBounds().height); 
    } 
}); 

Esto posiciona el menú casi lo mismo que un menú en una JMenuBar para mí, y la posición es consistente. Puede colocarlo de manera diferente modificando x e y en menu.show().

+0

El problema con el enfoque es que el menú emergente solo aparece cuando el usuario suelta el botón del mouse. El menú debería aparecer sobre el mouse hacia abajo, no hacia arriba con el mouse –

+0

Tienes razón. No me di cuenta. Todavía me gusta más que a la inversa, pero ninguno es completamente satisfactorio. Terminé no implementando lo que estaba tratando de hacer de esa manera y no lo usé de todos modos. Supongo que puedes hacer lo que hiciste y usar mi versión del menú. Muestra las coordenadas del botón para evitar la incoherencia de la posición. –

+0

Esta es una respuesta mucho mejor y debería obtener más votos. Se ve mejor que tener la ubicación del clic del mouse. – rsman

0

Aquí es un sencillo y agradable clase

enter image description here

import javax.swing.JPopupMenu; 
import javax.swing.JToggleButton; 
import javax.swing.event.PopupMenuEvent; 
import javax.swing.event.PopupMenuListener; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class MenuButton extends JToggleButton { 

    JPopupMenu popup; 

    public MenuButton(String name, JPopupMenu menu) { 
     super(name); 
     this.popup = menu; 
     addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ev) { 
       JToggleButton b = MenuButton.this; 
       if (b.isSelected()) { 
        popup.show(b, 0, b.getBounds().height); 
       } else { 
        popup.setVisible(false); 
       } 
      } 
     }); 
     popup.addPopupMenuListener(new PopupMenuListener() { 
      @Override 
      public void popupMenuWillBecomeVisible(PopupMenuEvent e) {} 
      @Override 
      public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { 
       MenuButton.this.setSelected(false); 
      } 
      @Override 
      public void popupMenuCanceled(PopupMenuEvent e) {} 
     }); 
    } 
} 
Cuestiones relacionadas