Estoy pegándole un repaso a todo lo referente a los menús con Swing usando Eclipse. No deja de sorprenderme lo fácil y rápido que lo tenemos una vez que te has familiarizado con Eclipse, y en concreto con el Swing Designer. En pocos minutos tenemos nuestro esqueleto de la aplicación listo para codificar sus funciones o encajarlo con códigos ya hechos, cada uno para lo que lo necesite…
Para todo ésto he usado la zona del Swing Designer que vemos a continuación:
Para hacer la estructura del ejemplo he puesto los siguientes componentes todos dentro del JMenuBar:
Archivo (JMenu)
– Poner título (JMenuItem)
– Barra separadora (JSeparator)
– Un JCheckBoxMenuItem (JCheckBoxMenuItem)
– Un JRadioButtonMenuItem (JRadioButtonMenuItem)
– Otro JRadioButtonMenuItem (JRadioButtonMenuItem)
– Salir (JMenuItem)
Colores (JMenuItem)
– Blanco (JMenuItem)
– Negro (JMenuItem)
– Cambiar el color de fondo con otros colores (JMenu)
— Verde (JMenuItem)
— Rojo (JMenuItem)
— Azul (JMenuItem)
Minimizar (JMenuItem)
En el JPopupMenu que pone ¡Hola! ¡Feliz Navidad! simplemente hay dos JMenuItem. En medio de la ventana he puesto un JSeparator para mostrar que se puede poner no sólo como un elemento de menú. Y luego tenemos un JLabel con la frase explicatoria.
Sólo hay que ponerse a juguetear con el Swing Designer y seguro que bien rápido que se le coge el truco.
Queda añadir cómo hacer que haga algo al hacer click, ésto se llama ponerle un manejador de evento, en éste caso al evento click del ratón. De nuevo usando el Swing Designer, que para eso está, para hacernos la vida más fácil xD le damos en cualquier componente Swing con el botón derecho y nos sale un menú desplegable como el siguiente:
En la opción ‘Add event handler’ tenemos todos los eventos disponibles que podemos asociar con casi cualquier componente. El que nos interesa ahora es el mousePressed que significa apretar el ratón, que en la imagen de arriba ya sale programado, por eso pone -> line 110, porque está en la línea 110 del código fuente. Ésto lo hacemos para cada cosa que queramos que haga algo al hacer click y al darle a mousePressed nos dirigirá al código para que lo programemos, creando el esqueleto del programa asociado a dicho evento del ratón.
Los elementos JCheckBoxMenuItem y JRadioButtonMenuItem también tienen el evento del click de ratón, y podemos usar una propiedad llamada ‘selected’ para saber si estan seleccionados o no y hacer lo correspondiente en cada caso.
Aquí tienes el código del ejemplo:
// el paquete del programa package principal; // las librerias de java para hacer todo... import java.awt.Color; import java.awt.Component; import java.awt.EventQueue; import java.awt.Frame; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JCheckBoxMenuItem; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRadioButtonMenuItem; import javax.swing.JSeparator; import javax.swing.border.EmptyBorder; // la clase principal public class Principal extends JFrame { // el panel que todo lo contiene private JPanel contentPane; // la entrada al programa, lo que primero // se ejecuta public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { // crea el frame en memoria // y lo visualiza Principal frame = new Principal(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } // ésto es el constructor de la clase // aquí está todo public Principal() { // al cerrar la ventana sale del programa setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // dimensiones y posición al arrancar del JFrame setBounds(100, 100, 450, 300); // la barra de menú JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); // el menú Archivo empieza aquí --------------------------------------- JMenu mnArchivo = new JMenu("Archivo"); menuBar.add(mnArchivo); JMenuItem mntmPonerTtulo = new JMenuItem("Poner tu00EDtulo"); mntmPonerTtulo.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { setTitle("Java Swing 5: Menús by jnj"); } }); mnArchivo.add(mntmPonerTtulo); JMenuItem mntmSalir_1 = new JMenuItem("Salir"); mntmSalir_1.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { dispose(); } }); JSeparator separator_1 = new JSeparator(); mnArchivo.add(separator_1); JCheckBoxMenuItem chckbxmntmUnJcheckboxmenuitem = new JCheckBoxMenuItem( "Un JCheckBoxMenuItem"); mnArchivo.add(chckbxmntmUnJcheckboxmenuitem); JRadioButtonMenuItem rdbtnmntmUnJradiobuttonmenuitem = new JRadioButtonMenuItem( "Un JRadioButtonMenuItem"); mnArchivo.add(rdbtnmntmUnJradiobuttonmenuitem); JRadioButtonMenuItem rdbtnmntmOtroJradiobuttonmenuitem = new JRadioButtonMenuItem( "Otro JRadioButtonMenuItem"); mnArchivo.add(rdbtnmntmOtroJradiobuttonmenuitem); mnArchivo.add(mntmSalir_1); // el menú Colores empieza aquí --------------------------------------- JMenu mnColores = new JMenu("Colores"); menuBar.add(mnColores); JMenuItem mntmBlanco = new JMenuItem("Blanco"); mntmBlanco.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { contentPane.setBackground(Color.WHITE); } }); mnColores.add(mntmBlanco); JMenuItem mntmNegro = new JMenuItem("Negro"); mntmNegro.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { contentPane.setBackground(Color.BLACK); } }); mnColores.add(mntmNegro); JMenu mnCambiarElColor = new JMenu( "Cambiar el color de fondo con otros colores"); mnColores.add(mnCambiarElColor); JMenuItem mntmVerde = new JMenuItem("Verde"); mntmVerde.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { contentPane.setBackground(Color.GREEN); } }); mnCambiarElColor.add(mntmVerde); JMenuItem mntmRojo = new JMenuItem("Rojo"); mntmRojo.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { contentPane.setBackground(Color.RED); } }); mnCambiarElColor.add(mntmRojo); JMenuItem mntmAzul = new JMenuItem("Azul"); mntmAzul.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { contentPane.setBackground(Color.BLUE); } }); mnCambiarElColor.add(mntmAzul); // el elemento del menú para minimizar está aquí --------------------------------------- JMenuItem mntmNewMenuItem = new JMenuItem("Minimizar"); menuBar.add(mntmNewMenuItem); mntmNewMenuItem.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { setState(Frame.ICONIFIED); } }); // aquí termina la barra de menú ... // el panel que todo lo contiene se crea contentPane = new JPanel(); // se le pone un borde contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); // se establece en el JFrame setContentPane(contentPane); // se hace JPopupMenu y lo pongo en el panel contenedor JPopupMenu popupMenu = new JPopupMenu(); popupMenu.setBounds(0, 0, 319, 58); addPopup(contentPane, popupMenu); // el primer elemento del desplegable JMenuItem mntmhola = new JMenuItem("u00A1Hola!"); popupMenu.add(mntmhola); // el segundo elemento del desplegable JMenuItem mntmfelizNavidad = new JMenuItem("u00A1Feliz Navidad!"); popupMenu.add(mntmfelizNavidad); // el resto del JPanel con la raya separadora y la etiqueta explicatoria contentPane.setLayout(null); JSeparator separator = new JSeparator(); separator.setBounds(31, 88, 372, 24); contentPane.add(separator); JLabel lblHazClickCon = new JLabel( "Haz click con el botu00F3n derecho en la ventana para que salga el menu00FA."); lblHazClickCon.setBounds(10, 118, 414, 76); contentPane.add(lblHazClickCon); } // ésto es lo relativo al menú desplegable // lo que hace es mostrar éste menú donde sea que hagamos click private static void addPopup(Component component, final JPopupMenu popup) { component.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (e.isPopupTrigger()) { showMenu(e); } } public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { showMenu(e); } } private void showMenu(MouseEvent e) { popup.show(e.getComponent(), e.getX(), e.getY()); } }); } }
Y también como viene siendo costumbre el fichero con todo…
Un saludo!