Comment créer un JButton avec un menu?
je veux créer une Barre d'outils dans mon application. Si vous cliquez sur un bouton sur cette barre d'outils, il apparaîtra un menu, tout comme dans la barre d'outils D'Eclipse. Je ne sais pas comment faire ça en Swing. Quelqu'un peut-il m'aider s'il vous plaît? J'ai essayé Google mais rien trouvé.
6 réponses
C'est bien plus dur en Swing qu'il ne doit l'être. Donc, au lieu de vous pointer vers des tutoriels, j'ai créé un exemple entièrement fonctionnel.
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);
}
}
je ne vois pas pourquoi c'est plus difficile qu'il doit être ou pourquoi vous devriez utiliser un MouseListener. La solution de Steve McLeod fonctionne, mais l'endroit où le menu apparaît dépend de l'endroit où la souris a été cliquée. Pourquoi ne pas simplement utiliser un ActionListener comme normalement utilisé pour un JButton. Cela ne semble ni plus dur ni moins dur.
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);
}
});
ceci positionne le menu à peu près comme un menu dans un JMenuBar pour moi, et la position est cohérente. Vous pouvez le placer différemment en modifiant le x et le y dans le menu.montrer.)(
je pense que c'est le même que dans AWT.
vous devez mettre une commande ActionCommand sur ce bouton et quand il est exécuté, afficher le menu pop-up en fonction des coordonnées de la souris.
Voir la section mettre en Place un Menu Déroulantcomment utiliser les Menus.
Je ne suis pas sûr de vous comprendre correctement, mais si vous voulez savoir comment faire des barres d'outils en oscillation, vérifiez ceci
Voici une classe simple et agréable
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) {}
});
}
}