Java: menú con animación

Java y NetBean, cómo hacer un menú personalizado con animación, mostrar ocultar un menú (JPanel).

Hola que tal java developers, en esta oportunidad les mostraré como crear un menú con animación. La animación trata de mostrar / ocultar un contenedor, que en este caso será un Panel, que contendrá varios componentes (esto ya lo puedes modificar a tu gusto), entonces el Panel en un principio, estará oculto, para después haciendo clic en un botón, se realice la animación y “baje” para que pueda ser visible. Bueno espero y les suene interesante, entonces vamos a empezar.






  1. Como primer paso deberás descargar la librería desde aquí.
  2. Ahora descarga los recursos que usaré en el ejemplo, claro también puedes crear tus propios recursos, no te limites a lo que yo comparto (si lo crees necesario).
  3. Teniendo los 2 archivos anteriores, ya podemos empezar a crear nuestro proyecto, entonces haciendo uso de NetBeans, creamos un nuevo proyecto:
    NOTA: Marcamos la casilla “Use dedicated folder for storing libraries” o “Usar una carpeta dedicada para almacenar las bibliotecas” (en caso de que lo tengas en español).
  4. Ahora le damos clic derecho al nuestro proyecto, y seleccionamos la opción “Propiedades”, después en la ventana emergente, seleccionamos la opción “Add Jar Folder”, para agregar nuestra librería de Nef-Animacion.



  5. Buscamos la ruta donde guardamos la librería (no importa el lugar donde se encuentre, escritorio, descargas, etc.), y marcamos la opción de “Copiar a la carpeta de bibliotecas”. Esto se hace con el fin de que cuando queramos generar nuestro Jar de la aplicación, este contenga todas las librerías y trabaje perfectamente, si no, después andas batallando por cuestión de las rutas relativas y absolutas (indicar la ruta como dirección de una carpeta local).


    NOTA: Esto lo puedes aplicar para tus demás proyectos donde utilices librerías, es una buena práctica.
  6. Bien, ahora creamos un nuevo paquete, para almacenar los 2 recursos que usaremos, las imágenes y el frame.

  7. Dentro de este paquete, creamos un nuevo JFrame, y le añadimos un Panel, este panel lo cambiamos de tamaño, de modo que cubra toda la superficie del frame, como si fuera un fondo de pantalla :).
  8. A este panel, le cambiaremos su propiedad de “Ajuste de distribución”, dando clic derecho sobre el panel, y elegimos la opción de “Absolute layout” o “Diseño absoluto”.

  9. Ahora agregamos otro Panel, encima del anterior, le puedes cambiar el color para identificarlo, también cambia los nombres de los componentes para no confundirlos. Este nuevo panel lo hare de 580px de ancho y 110px de alto, de un color gris oscuro. Bien, después de esto, damos clic derecho al nuevo panel y seleccionamos “Propiedades”, dentro de aquí bajamos hasta encontrar el encabezado “Gestor de distribución”, en donde aparecen una X y una S.
  10. X representa el eje de las X, y S representa el eje de las Y. Entonces, como el ejemplo trata de que mostrara y ocultara un menú (haciendo animación de arriba hacia abajo y viceversa) modificaremos la coordenada S, donde le pondremos un numero negativo (para que se valla hasta arriba, por encima del frame) para que no se vea. Podemos ver el tamaño (el alto es el segundo numero) viendo en “Preferred Size”, de esta manera, deberás asignar ese mismo número pero en negativo, para la coordenada S o Y.

  11. Como pueden ver en la imagen, se ve como el panel ha sido colocado hasta arriba del frame, por lo tanto el usuario no lo prodra ver cuando ejecute la aplicación.

  12. Colocamos nuestras imágenes (las que descargaron hace rato) y las copiamos al paquete del proyecto.
  13. Ahora colocamos una etiqueta (JLabel) sobre el primer panel (el fondo, NO el menú) y la situamos más o menos a la mitad de todo frame (que se vea centrado pues). Después damos clic derecho a la etiqueta y en “Propiedades” seleccionamos “Icon”, y elegimos la imagen de “Bajar” para que se muestre con el pico hacia abajo:







    Y para no tener problemas, arrastramos la etiqueta encima del panel de menú (OJO arrastrarla en la pequeña ventana “Navegador”, que se encuentra en la parte inferior izquierda de tu pantalla, esa en donde se listan los componentes) de tal manera que la nueva etiqueta quede por encima del menú (para que el menú no la tape cuando baje).
  14. Seleccionamos nuestra etiqueta que tiene la imagen y damos clic derecho, seleccionamos la opción “Eventos” --> “Mouse” --> “mouseReleased”

  15. Ahora este es el código que agregaremos:
    Agregamos estas dos librerias (Una de ellas es la de Animción) que desacargamos antes y que colocamos en el proyecto.
    import Animacion.Animacion;
    import javax.swing.ImageIcon;
    

    Después, en el evento de la etiqueta (el mouseReleased de hace un momento) colocamos este código:
    int posicion = mi_etiqueta_icono.getY();
            if(posicion > 0){ //está abajo, ya bajó el menú, ahora hay que subirlo
                Animacion.subir(0, -110, 2, mi_panel_menu);
                Animacion.subir(95, 0, 2, mi_etiqueta_icono);
                img_down();
            }else{ // está arriba, no ha bajado el menú
                Animacion.bajar(-110, 0, 2, mi_panel_menu);
                Animacion.bajar(0, 95, 2, mi_etiqueta_icono);
                img_up();
            }
    


    Ahora añaden estos dos métodos (el img_up() y el img_down()):

    public void img_up(){
            ImageIcon img = new ImageIcon(getClass().getResource("nombre_imagen_apuntaArriba.png"));
            etq_icono.setIcon(img);
    }
    public void img_down(){
            ImageIcon img = new ImageIcon(getClass().getResource("nombre_imagen_apuntaAbajo.png"));
            etq_icono.setIcon(img);
    }
    
  16. Bueno, después de agregar el código, ya lo pueden ejecutar, y verán que al hacer clic sobre la etiqueta, se despliega el “Menú” que es un jpanel sin nada.


  17. Pueden agregar componentes al panel Menú, para ello (porque se encuentra hasta arriba y no se ve) pueden dar doble clic al panel menú, dentro del listado de componentes:

  18. Ahora pueden ejecutarlo nuevamente, para verlo en funcionamiento, pero ahora con más objetos, con botones, botones de radio, checks, combos, etc. Agreguen lo que quieran.

Explicación básica de la librería

Bueno, básicamente la librería tiene 2 métodos, el de subir y el de bajar componente.
Ambos reciben 4 parámetros (posición inicial Y, posición final Y, tiempo retardo en milisegundos, componente)
int posicion = mi_etiqueta_icono.getY();
        if(posicion > 0){ //está abajo, ya bajó el menú, ahora hay que subirlo
            Animacion.subir(0, -110, 2, mi_panel_menu);
            Animacion.subir(95, 0, 2, mi_etiqueta_icono);
            img_down();
        }else{ // está arriba, no ha bajado el menú
            Animacion.bajar(-110, 0, 2, mi_panel_menu);
            Animacion.bajar(0, 95, 2, mi_etiqueta_icono);
            img_up();
        }

Si se fijan, Animacion.subir(0, -110, 2, mi_panel_menu); recibe los parametros: 0 = coordenada Y inicial.
-110 = coordenada Y final, esto quiere decir que el componente se desplazará desde la coordenada 0 hasta la -110 con un retardo de 2 milisegundos (cada 2 milisegundos avanza 1px).
2 milisegundos
Y el componente: panel_menu.
De la misma manera funciona el Animacion.bajar

NOTA: Si quieren modificar el tamaño del menú (si lo quieren más pequeño o más grande), háganlo, cambien el tamaño en la interfaz, pero NO se olviden de cambiar también el código (en el evento de la etiqueta) porque se desfasa y se ve mal.





Les dejo el video:



Bueno Java devs, espero que les guste, si tienen dudas, en algo no explique bien, o si siguieron todos los pasos y aún tienen errores, dejen un comentario, los responderé lo más rápido posible.

Gracias, compartan con sus amigos :)

guibox

Próximo Ing. en sistemas computacionales (sólo falta el título ;)). Apasionado por el diseño de interfaces de usuario y el responsive design y no por eso dejo de programar la lógica de los sistemas, no hay lenguaje al que le haga el feo, si no se programar en él, que se prepare que será el próximo objetivo ;).

14 comentarios:

  1. jomi donde pusiste import Animacion.Animacion; me tira un error y no abre la ventana

    ResponderBorrar
    Respuestas
    1. hola, si cargaste la librería?, ¿qué error te marca?, si pudieras poner la excepción que te manda a pantalla, estaría genial para ayudarte ;)

      Borrar
  2. El vídeo se encuentra suprimido por algo sobre contenido de Derechos de Autor
    Por cierto, como recomendación en lo personal a mi me encanta ver vídeos sobre esto, pero ya que incluyes como hacerlo paso a paso a través de imágenes a manera de tutorial también seria bueno que pusieras al final una imagen con el resultado, o en este caso un gif seria lo mas adecuado.
    Solo una sugerencia de mi parte

    Muchas gracias por compartir!

    ResponderBorrar
    Respuestas
    1. Gracias por comentar eso del vídeo, no sabía que estaba bloqueado, en estos días arreglo eso, y si falta ponerle un previo para el resultado, muchas gracias bro :)

      Borrar
  3. Al dar clic en la etiqueta muestra el siguiente error: Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedClassVersionError: Animacion/Animacion : Unsupported major.minor version 52.0

    ResponderBorrar
    Respuestas
    1. Hola que tal, gracias porealidad comentar y disculpa por no responderte a tiempo.
      Creo que es por la versión de java que estas usando, creo usas la 1.7, descarga esta versión de la librería para java 1.7
      http://www.guibox.tk/2016/02/java-libreria-nefanimacion-v21-funcion.html?m=1

      Borrar
  4. Buenas Noches, estoy tratanto de usar la libreria NefAnimacion_v2; y no estoy consiguiendo el efecto que consigues en el video:
    /////////
    NefAnimacion_v2
    public static void bajar(int inicio, int fin, long retardo, int salto, JComponent componente) {
    }
    NefAnimacion
    public static void bajar(int inicio, int fin, int retardo, JComponent componente) {
    }
    //////////////

    Este es el codigo que probe ( no soy un experto) quisiera saber si podrias ayudarme con esto:


    private void flechaabajoMouseReleased(java.awt.event.MouseEvent evt) {
    int posicion = flechaabajo.getY();
    if(posicion > 0){ //está abajo, ya bajó el menú, ahora hay que subirlo

    Animacion.Animacion.subir(0, -110, 2, 2, panelmenu);



    Animacion.Animacion.subir(95, 0, 2, 2, flechaabajo);
    img_down();

    }else{ // está arriba, no ha bajado el menú

    Animacion.Animacion.bajar(-110, 0, 2, 2, panelmenu);

    Animacion.Animacion.bajar(0, 95, 2, 2, flechaabajo);
    img_up();
    }
    }

    private void img_down() {
    ImageIcon img = new ImageIcon(getClass().getResource("C:/------/-----/------/bajar_limon.png"));
    flechaabajo.setIcon(img);
    }

    private void img_up() {
    ImageIcon img = new ImageIcon(getClass().getResource("C:/------------/---------/botones/subir_limon.png"));
    flechaabajo.setIcon(img);
    }

    ResponderBorrar
    Respuestas
    1. Hola que tal, gracias por comentar, oye sería mucha molestia que me pasaras tu archivo completo? la clase que usas para ejecutarla y ver cual es el problema por favor

      Borrar
    2. Por que medio te facilito los archivos amigo?. Estoy tratatando de crear un menu principal, con los botones con movimiento de entrada y salida, logre realizar eso pero al tratar de conbinar, con este proyecto, no me toma especificamente los datos de la libreria tengo conflictos, ya que los parametros varian en las librerias segun las versiones, ya que ibas adaptando mas parametros.

      Borrar
    3. hola mandamelos a nefas1809@gmail, para ver el porque no puedes usarlo, y en un momento te ayudo y te digo, va?

      Borrar
  5. Hey GUI BOX,

    Can you please make the animation library in English, and defining all the methods also in English, please your work in that library is amazing, but if you can make it in English it will be very use full to a lot of people out there.

    Thanks

    ResponderBorrar
    Respuestas
    1. hi, ofcourse, my english is bad but i can try to make it the library in english with documentation, thanks for the comment, have a nice day.

      Borrar
  6. hola bro, necesito tu ayuda, tengo un problema con el panel, todo va bien hasta que se mueven, pasa un rato y de la nada el panel de vuelve a su posicion inicial y el que bajo vuelve a subir solo, si supieras cual es este problema me ayudarias bastante

    ResponderBorrar
  7. Hola una pregunta, es que ya no esta disponible la librería en el link que nos das en el video, ¿Dónde más puedo conseguir la librería?

    ResponderBorrar