JMenu |
|||||||||||
Archivos necesarios: |
|||||||||||
Ahora veremos como utilizar el JMenu y todas las demás clases que nos permiten mostrar menús. Mostrar menus es algo un poco revoltoso porque se necesitan un gran número de clases para poder hacerlo pero no es complicado una vez que entendemos cómo manejarlos. Los menus nos sirven para mostrar una gran cantidad de opciones sin saturar al usuario además de que nos permiten crear una interfaz consistente. Se pueden utilizar en un juego para mostrar opciones del juego (como empezar un juego nuevo o guardar una partida actual), opciones de dificultad (donde podemos elegir el nivel), etc. El primer archivo contiene una clase basada en el editor de texto que utilizamos para aprender sobre archivos de texto pero ahora el menú ha sido expandido bastante y nos provee mucha más funcionalidad además de que los comentarios están enfocados a este y no a archivos. El segundo archivo contiene algunos íconos, como siempre es necesario que estén en el mismo directorio que los archivos .class que se generan al compilar. |
|||||||||||
¿Cómo utilizar el JMenu? |
|||||||||||
|
Existen tres clases importantísimas al utilizar menus en Java:
Todo esto es muy importante tenerlo en mente ya que cuando creamos nuestros menus tenemos que crear una barra de menu (con JMenuBar) y después agregarle varios menus (con JMenu) y a cada uno de los menús ponerle opciones y botones (con JMenuItem). |
||||||||||
| Como puedes ver en la imágen de la derecha, poner un JMenuBar es tan fácil como agregar una sola línea donde lo iniciamos. | |||||||||||
![]() |
Agergar un JMenu también es muy sencillo, lo único que tenemos que hacer es iniciar un nuevo JMenu con el texto que queremos que aparezca y después tenemos que agregarlo al JMenuBar que creamos en el paso anterior. También podemos ponerle una tecla de acceso rápido con setMnemonic() que recibe un KeyEvent, que podemos obtener como se ve en la foto. Para cambiar la letra es preciso cambiar el VK_A por VK_X donde X es la letra a la que queremos cambiar. | ||||||||||
| Al agregar el JMenuItem es cuando las cosas empiezan a ponerse un poco más complicadas. Primero que nada podemos ver que el constructor recibe el texto que queremos que muestre el elemento del menú. Después vemos el método setAccelerator() que recibe un KeyStroke. Este método nos sirve para elegir la tecla de acceso rápido (por ejemplo para crear un archivo nuevo sería CTRL+N) | ![]() |
||||||||||
Para obtener el KeyStroke podemos utilizar el método getKeyStroke() que se ve en la foto superior. Este método recibe un KeyEvent que representa la tecla que se va a apretar y después un valor int que representa si estamos presionando alguna tecla modificadora, valores válidos para esto son las constatnes: CTRL_MASK, ALT_MASK y SHIFT_MASK de ActionEvent y el valor 0 cuando no queremos que se presione ninguna tecla. Recuerda que no es indispensable poner las teclas de acceso rápido al crear el menú así que si no te quedó muy claro puedes construir tu menú sin utilizarlos. También podemos ver que utilizamos el método setIcon() que se comporta en exactamente la misma manera que vimos en el trial de imágenes. Después de eso vemos que podemos agregarle un ActionListener a nuestros JMenuItem para que puedan responder a eventos. En la última línea estamos agregando el elemento del menú "Nuevo" al menú de "Archivo". |
|||||||||||
Un paso más allá |
|||||||||||
| Además de los menus como acabamos de verlos podemos hacer muchos tipos más de menus. Tenemos menus dentro de menus (como el menú de Word de Insertar -> Imagen), hay menus que incluyen un JCheckBox para poder elegir opciones, también hay menus que tienen JRadioButton y por último hay menus que aparecen al presionar el botón derecho del mouse. Vamos a ver cada uno de ellos un poco más a detalle. | |||||||||||
![]() |
Como podemos ver en la imágen de la izquierda crear un menú dentro de otro menú es muy sencillo. Primero podemos ver que tenemos un menú llamado mnuFormato que vamos a agregar en el JMenuBar principal, después podemos ver que creamos otro menú llamado mnuAlineacion que vamos a agregar a mnuFormato mediante el método add() que utilizamos normalmente para agregar a un JMenuBar. Con esto el menú de "Alineación" va a aparecer dentro del menú "Formato". | ||||||||||
Ahora veamos cómo agregar elementos del menú que tengan un JRadioButton para que nos permita elegir solamente una posible opción. En la foto de la derecha podemos ver que el comportamiento de este tipo de menus es muy similar al de los JRadioButton normales ya que heredan una gran cantidad de funcionalidad de estos. |
![]() |
||||||||||
Primero podemos ver que tenemos que crear un ButtonGroup para que todos los JRadioButtonMenuItem sean del mismo grupo y no se pueda seleccionar más que uno. Después podemos ver que el constructor es muy similar a los que hemos visto hasta ahora donde tenemos que pasarle un String con el texto que queremos que muestre, podemos ver que también podemos agregarle teclas de acceso rápido mediante setMnemonic() y también podríamos utilizar setAccelerator() aunque no se muestra en la imágen. También vemos que tiene los métodos de la clase JRadioButton como setSelected(). Para saber más sobre cómo utilizar los JRadioButtonMenuItem te recomiendo que leas el trial de los JRadioButton ya que todos los métodos que utilizamos de estos son compatibles (incluso los de imágenes). |
|||||||||||
![]() |
Al igual que los JRadioButtonMenuItem son muy similares a los JRadioButton los JCheckBoxMenuItem son muy similares en su comportamiento a los JCheckBox como podemos ver inclusive tenemos que utilizar el ItemListener para escuchar sus eventos. | ||||||||||
| Lo único que cabe mencionarse es que el constructor del JCheckBoxMenuItem recibe un String con el texto que queremos que despliegue y que podemos utilizar todos los métodos que ya vimos en el trial de JCheckBox. | |||||||||||
![]() |
Crear un JPopupMenu es muy similar a crear un menú normal, primero tenemos que crear un objeto de tipo JPopupMenu y después tenemos que agregarle JMenuItems. Lo único que es importante mencionar es que si queremos hacer que aparezcan menus que ya estabamos utilizando antes tenemos que crear JMenuItems nuevos, no podemos utilizar los que ya teníamos, porque Java maneja los componentes de tal manera que solamente puedan existir una vez y si queremos agregarlos dos veces una de las dos va a desaparecer. | ||||||||||
| Ahora viene la parte interesante del JPopupMenu: Primero tenemos que crear tantos menus como vamos a utilizar, después a cada componente que va a tener un JPopupMenu debemos agregarle un MouseListener con el método addMouseListener() que recibe quién debe controlar el evento (por ahora siempre vamos a usar this) y por último debemos crear los métodos mousePressed() y mouseReleased() que reciben un MouseEvent. Dentro de cada uno de estos métodos debemos de revisar si el evento debe mostrar un popup (en Windows quiere decir si es click derecho) mediante el método isPopupTrigger() y que control generó el evento mediatne getSource(). Ahora debemos utilizar el método show() del JPopupMenu para mostrar el menú, este método recibe tres parámetros, el primero es el control que mandó llamar el menú y los otros dos son las coordenadas (x,y) donde debe aparecer el menú. | ![]() |
||||||||||