web-dev-qa-db-fra.com

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 de cette barre d'outils, un menu apparaîtra, tout comme dans la barre d'outils d'Eclipse. Je ne sais pas comment faire ça dans Swing. Quelqu'un peut m'aider s'il vous plaît? J'ai essayé Google mais rien trouvé.

32
Kien Truong

Ceci est bien plus difficile dans Swing qu'il ne le faut. Ainsi, au lieu de vous diriger vers des tutoriels, j'ai créé un exemple pleinement 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
Steve McLeod

Je ne vois pas pourquoi c'est plus difficile que cela ne devrait l'être ou pourquoi vous devriez utiliser MouseListener. La solution de Steve McLeod fonctionne, mais l'emplacement dans lequel le menu apparaît dépend de l'endroit où la souris a été cliquée. Pourquoi ne pas utiliser simplement un ActionListener normalement utilisé pour un JButton. Cela ne semble ni plus difficile ni moins difficile.

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

Cela positionne le menu à peu près de la même façon qu'un menu dans une barre de menus J pour moi, et la position est cohérente. Vous pouvez le placer différemment en modifiant x et y dans menu.show ().

14
Kenneth Evans

Je pense que c'est la même chose que dans AWT.

Vous devez placer une ActionCommand sur ce bouton et, lorsqu'il est exécuté, afficher le menu contextuel en fonction des coordonnées de la souris.

2
Cristina

Voir la section Créer un menu contextuel, dans Comment utiliser les menus .

2
TH.

Je ne suis pas sûr de bien vous comprendre, mais si vous voulez savoir comment créer des barres d’outils dans Swing, cochez cette case.

Tutoriels Java: Comment utiliser les barres d’outils et cela

Tutoriels Java: comment utiliser des actions

1
jitter

Voici un cours simple et sympa

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
luca