JPopupMenu es una clase que permite crear un menú emergente, gracias a esta clase nosotros podemos desplegar un menú al presionar clic derecho.

Esto puede ser útil si usted se encuentra desarrollando una aplicación como: editor de texto, editor de imagenes, entre otros.

Sin embargo, aveces suele ser complicado crear este tipo de menú. Afortunadamente, explicare de manera breve una forma sencilla de implementarlo. Cabe mencionar, que solo mencionare los métodos necesarios para poder llevar acabo el menú emergente y no hablare a fondo sobre esta clase.

El único método a utiliza es:

setComponentPopupMenu(JPopupMenu component); este método se encarga de establecer el menú emergente. Sobre el objeto donde fue utilizado.

Antes de comenzar a crear el menu emergente, usted debe tener conocimiento previo de como crear menus en java, debido a que estos son utilizado para crear el menu emergente.

Primero comenzaremos creando nuestra ventana, esto se realiza siempre para poder agregar nuestro JPanel.

package menuemergente;

import javax.swing.JFrame;

public class MenuEmergente {

    public static void main(String[] args) {
        PanelMenuEmergente panel = new PanelMenuEmergente();
        JFrame f = new JFrame("Evento Menu Emergente");
        f.add(panel);
        f.setBounds(150, 100, 500, 400);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
    
}

La siguiente clase es nuestro JPanel con el menú previamente creado, tiene una clase interna anónima encargada de gestionar eventos. Se realizo de esta forma para facilitar el código a ustedes y sea entendible para aquellos usuarios que apenas comienzan.

Mencionado lo anterior, el siguiente ejemplo es:

Escribir un programa que permita cambiar el color del panel mediante un menú emergente, el menú emergente debe desplegarse al presionar clic derecho.

package menuemergente;

import java.awt.Color;
import java.awt.event.*;
import javax.swing.*;

public class PanelMenuEmergente extends javax.swing.JPanel {

    private JMenuItem colorVerde;
    private JMenuItem colorAmarillo;
    private JMenuItem colorRojo;
    private JMenuItem colorNegro;

    public PanelMenuEmergente() {
        initComponents();
        addMenuEmergente();
        addEventos(new ControladorMenus(this));
    }

    private final void addEventos(ControladorMenus controlador) {
        colorVerde.addActionListener(controlador);
        colorAmarillo.addActionListener(controlador);
        colorRojo.addActionListener(controlador);
        colorNegro.addActionListener(controlador);
    }

    private final void addMenuEmergente() {
        JPopupMenu menuEmergente = new JPopupMenu();

        colorVerde = new JMenuItem("Verde");
        colorAmarillo = new JMenuItem("Amarillo");
        colorRojo = new JMenuItem("Rojo");

        JMenu otroColores = new JMenu("Otros Colores");
        colorNegro = new JMenuItem("Negro");
        otroColores.add(colorNegro);

        menuEmergente.add(colorVerde);
        menuEmergente.add(colorAmarillo);
        menuEmergente.add(colorRojo);
        menuEmergente.add(otroColores);

        this.setComponentPopupMenu(menuEmergente);
    }

    private class ControladorMenus implements ActionListener {

        private JPanel panel;

        public ControladorMenus(JPanel panel) {
            this.panel = panel;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            switch (e.getActionCommand()) {
                case "Amarillo":
                    panel.setBackground(Color.YELLOW);
                    break;
                case "Verde":
                    panel.setBackground(Color.GREEN);
                    break;
                case "Rojo":
                    panel.setBackground(Color.RED);
                    break;
                case "Negro":
                    panel.setBackground(Color.BLACK);
            }
        }

    }
                
    private void initComponents() {
        setLayout(new java.awt.BorderLayout());
    }                     
                 
}

El primer paso es crear el menu, para ello creamos diferentes opciones de menú (JMenuItem) indicando mediante texto el color de fondo que establecerán.

Adicionalmente, se crea un menu (JMenu). Esto se realiza con el fin de crear una opción llamada «Otros» que muestre mas colores, en otras palabras es un menú dentro de otro menú.

El segundo paso fue crear un objeto de la clase JPopupMenu llamado menuEmergente. Esta clase cuenta con el método add(), el cual me permite agregar las opciones de menu (JMenuItem) y menú adicional (JMenu). Adicionando estos objetos nos permite crear un menu emergente, solo falta indicar donde debe ser visible.

Finalmente debemos indicar el componente que queremos agregarle nuestro menú emergente, en este caso lo haremos al JPanel. Como nuestra clase hereda de JPanel, usamos la palabra reservada this indicando que usaremos la propia clase, escribimos un punto delante y mostrara los metodos disponibles.

Usaremos el método setComponentPopupMenu y pasamos por parámetro el objeto JPopupMenu creado.

El método usado, por defecto se encarga de gestionar eventos de mouse. Pues detecta cuando se ha presionado clic derecho y muestra el menú emergente. De esta forma ahorramos escribir mas lineas de código.

Ejecutamos nuestro proyecto y ahora cada que presionamos clic derecho sobre el contexto, se despliega nuestro menú emergente.

null

Ademas, las opciones de menu pueden usar la interfaz ActionListener. Por este motivo se creo la clase ControladorMenus encargada de gestionar este tipo de eventos de acción.

Tiene un constructor que recibe por parámetro un objeto de tipo JPanel, esto se hace para lograr cambiar el color de fondo. Obteniendo como resultado lo siguiente al presionar la opción de menú con el color deseado:

Espero sea de utilidad este breve ejemplo, puedes realizar cosas mas interesantes teniendo estas bases mencionadas. Solo debes imaginar todas las posibilidades.