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é.

32
demandé sur CajunLuke 2009-11-07 13:47:09

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);
    }
}
30
répondu Steve McLeod 2009-11-07 15:02:10

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.)(

14
répondu Kenneth Evans 2012-12-19 12:56:14

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.

2
répondu Cristina 2009-11-07 10:50:07

Voir la section mettre en Place un Menu Déroulantcomment utiliser les Menus.

2
répondu TH. 2009-11-07 11:35:56

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

tutoriels Java: comment utiliser les barres D'outils et

tutoriels Java: comment utiliser les Actions

1
répondu jitter 2009-11-07 11:30:34

Voici une classe simple et agréable

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) {}
        });
    }
}
0
répondu luca 2016-07-06 14:10:52