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) {}
});
}
}
Consulte la sección Cómo abrir un menú emergente , en Cómo usar los menús .
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 estoy seguro de que te entiendo correctamente, pero si quieres saber cómo hacer barras de herramientas en Swing comprueba esto
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 ().