Pregunta

Quiero crear una barra de herramientas en mi solicitud. Si hace clic en un botón en esa barra de herramientas, se mostrará 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? He tratado de Google pero no encontré nada.

¿Fue útil?

Solución

Esta es la forma más difícil de oscilación de lo que debe ser. Así que en lugar de señalar que a tutoriales He creado un ejemplo completamente de trabajo.

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

Otros consejos

No veo por qué esto es más difícil de lo que debe ser o por qué se debe utilizar un MouseListener. La solución de Steve McLeod funciona, pero donde aparece el menú depende del lugar donde se hizo clic en el ratón. ¿Por qué no sólo tiene que utilizar un ActionListener como los utilizados normalmente para un JButton. No parece ni más difícil ni menos duro.

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 lo mismo que un menú en un JMenuBar para mí, y la posición es consistente. Se podría colocar de otra manera mediante la modificación de la X e Y en menu.show ().

Creo que es el mismo que en el AWT.

Usted debe poner ActionCommand en ese botón y cuando se ejecuta mostrar el menú emergente de acuerdo con las coordenadas del ratón.

Vea la sección La fiera de un menú emergente , en Cómo utilizar los menús .

No estoy seguro le he entendido bien, pero si quieres saber cómo hacer que las barras de herramientas de verificación de oscilación de este

tutoriales de Java: cómo utilizar la herramienta Bares y esto

tutoriales de Java: Cómo utilizar las acciones

Esta es una clase simple y agradable

introducir descripción de la imagen aquí

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) {}
        });
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top