menus hacer ejemplo desplegable con como botones actionperformed java swing menu jbutton jpopupmenu

java - hacer - ¿Cómo crear un JButton con un menú?



menus en java swing (6)

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.


Aquí hay una clase simple y agradable

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) {} }); } }



Creo que es lo mismo que en AWT.

Debería poner un ActionCommand en ese botón y cuando se ejecute, muestre el menú emergente según las coordenadas del mouse.


Esto es mucho más difícil en Swing de lo que necesita ser. 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); } }



No veo por qué es más difícil de lo que debe ser o por qué debería usar 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 igual 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 ().