Entrada destacada

Como dar estilo a un Scroll Pane de JavaFX utilizando CSS

Imagen
Bien en esta ocasión quiero compartir como darle estilo a un scroll pane de JavaFx, por lo que colocaré el código con las clases que se pueden utilizar para cambiar el aspecto de los objetos o nodos que componen la interfaz del contenedor. El Scroll pane está compuesto por los siguientes nodos u objetos: Scroll-bar: Vertical (.scroll-bar:vertical)/Horizontal(.scroll-bar:horizontal): Se refiere a la barra que se muestra para poder realizar el scroll de forma vertical u horizontal. Esta a su vez está compuesta por los siguientes nodos: Increment-button: Este es el botón que se muestra en la scroll-bar para poder realizar el scroll hacia abajo o incrementar la posición del scroll. Este nodo a su vez contiene el siguien...

Barra de menu con estilo en JavaFX utilizando CSS

Barra de menu con estilo en JavaFX utilizando CSS

En esta entrada quiero compartir un poco más sobre JavaFx. En estos últimos días he estado trasteando un poco con las interfaces graficas de java sobre todo con la librería JavaFx y bueno, para ser sincero me sentía acostumbrado a trabajar con Swing, sin embargo, como sabrás esta librería ya se encuentra casi en desuso y sobre todo con las nuevas tendencias en diseño pues se vuelve complicado poder darles a nuestros proyectos un estilo moderno.

En esta ocasión he decido compartir un poco de lo que he aprendido.

Vamos a darle estilo o una barra de menús, dándole un diseño mas acorde a nuestras necesidades, empezaré creando un nuevo proyecto, en mi caso lo haré utilizando el IntelliJ, tu puedes hacerlo en el IDE que más te agrade.

 

Proyecto para dar estilo a la barra de menus javafx


 

El proyecto lo cree utilizando Maven y correrá con un JDK 11, también y la versión 18.0.1 de JavaFx.

Las dependencias en mi archivo POM quedan de la siguiente forma

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.openjfx</groupId>
  4. <artifactId>javafx-controls</artifactId>
  5. <version>18.0.1</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.openjfx</groupId>
  9. <artifactId>javafx-fxml</artifactId>
  10. <version>18.0.1</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.junit.jupiter</groupId>
  14. <artifactId>junit-jupiter-api</artifactId>
  15. <version>${junit.version}</version>
  16. <scope>test</scope>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.junit.jupiter</groupId>
  20. <artifactId>junit-jupiter-engine</artifactId>
  21. <version>${junit.version}</version>
  22. <scope>test</scope>
  23. </dependency>
  24. </dependencies>

Como es de esperar nuestro IDE genera automáticamente un código de prueba, con un archivo FXML y su controlador correspondiente. Para trabajar la parte grafica utilizaré SceneBuilder.

Bueno pare realizar el test de cambiar el diseño empecé renombrando el archivo FXML por MenuBarTest.fxml y también la clase principal a la cual llamé Main.java y el controlador correspondiente le coloqué MenuBarTestController.java.

Dando estilo a la barra de menus javafx


 

En mi diseño simplemente agregué como nodo padre un BorderPane y en la sección TOP de este coloqué una MenuBar. Al agregar el nodo al BorderPane, SceneBuilder tres menús (File, Edit, Help) los cuales contienen a su vez MenuItems, esto me va muy bien para esta practica ya que la idea es darle estilo tanto a la MenuBar como a los Menus y los MenuItems.

El siguiente paso que realicé es crear un nuevo archivo CSS y guardarlo en la carpeta resources, para esta prueba lo guardaré en el mismo directorio en donde se encuentra el archivo FXML.

Proyecto dando estilo a la barra de menus en javafx


En la imagen anterior se puede observar la estructura del proyecto de prueba, claro está que de acuerdo al IDE que utilicemos puede variar o no la misma.

El siguiente paso es indicarle a nuestro archivo FXML que debe de importar y utilizar el archivo CSS, en JavaFX cada uno de los nodos puede importar su propio archivo css, en esta ocasión le asigne a la barra de menú  el archivo CSS que utilizaré para darle estilo, por lo que en SceneBuilder es sencillo, simplemente hay que pinchar el botón de Stilesheets como se observa en la siguiente imagen:

Proyecto dando estilo a la barra de menus en javafx


Luego nos movemos en el buscador de archivos hasta donde se encuentra nuestro archivo CSS si es que no se tiene como en mi caso en el mismo directorio de nuestro archivo FXML. Una vez seleccionado nuestro archivo y pinchando en el botón de aceptar veremos que ahora nos muestra un cambio en la zona de Stilesheets como se muestra en la siguiente imagen:

Proyecto para darle estilo a la barra de menus en javafx con css


Ya con esto podemos hacer uso de nuestro archivo CSS, por lo que comenzare dándole estilo a la barra de menú.

A continuación, les muestro el código CSS comentado.

 

  1. /*
  2. Para acceder a la menubar utilizamod la clase css menu-bar.
  3. Nota: en css de javafx hay muchas de las funciones del css
  4. para el desarrollo web que no son aplicables.
  5. */
  6. .menu-bar{
  7. /*Le damos un background color de verde azulado*/
  8. -fx-background-color: #00796B;
  9. /*Le damos un padding de 5 */
  10. -fx-padding: 5;
  11. }
  12.  

El resultado del código anterior lo podemos observar en la siguiente imagen:

Proyecto para darle estilo a la barra de menus en javafx con css


El color de la barra de menú cambio a verde azulado, ahora para darle un poco mas de estilo al diseño cambiare el tipo de fuente, color del texto de los Label y también usare la tipografía Roboto, así mismo le daré un tamaño de fuente de 18.

  1. /*
  2. Para acceder al Label que muestra el texto del Menu entonces lo hacemos de la siguiente forma
  3. .menu-bar > .container > . menu-button > .label
  4. de esta forma podemos cambiar el color, tamaño tipo de fuente, padding entre otras funciones
  5. cabe destacar que utilizando esta forma cambiaremos solamente los Label que se encuentran
  6. dentro de la barra de menus ya que si solo utilizamos la clase .label el codigo css afectaría
  7. a todos los Labels que contenga nuestro border pane
  8. para esta prueba le cambiaré el color de texto, el tamaño de la fuente el tipo de fuente y el
  9. tipo de letra
  10. */
  11. .menu-bar > .container > .menu-button >.label{
  12. /*Cambiamos el color del texto*/
  13. -fx-text-fill: #FFFFFF;
  14. /*Cambiamos el tamaño de la fuente*/
  15. -fx-font-size: 18;
  16. /*Cambiamos el tipo de fuente Nota: en mi caso utilizo la fuente roboto porque la tengo
  17. instalada dentro de mi sistema operativo*/
  18. -fx-font-family: "Roboto";
  19. /*Colocamos el texto en negrita*/
  20. -fx-font-weight: bold;
  21. }
  22.  

El resultado del código anterior lo podemos observar en la siguiente imagen:

Proyecto para darle estilo a la barra de menus en javafx con css


Como podemos observar se ve mucho mejor, ahora bien, para darle al estilo al menú cuando el ratón se coloca sobre el, utilizamos la pseudoclase hover el cual también podemos complementar con la pseudo clase showing y focused.

La pseudoclase showing controla cuando el menú ha sido pinchado y muestra los Menu Items que tiene como hijos, como podemos observar en las siguientes imagenes:

Pseudoclase hover:

Proyecto para darle estilo a la barra de menus en javafx con css


Pseudoclase showing:

Proyecto para darle estilo a la barra de menus en javafx con css


El comportamiento de la pseudoclase focused la veremos cuando le demos estilo al menú item. Para darle estilo a estos comportamientos podemos utilizar el siguiente código:

  1. /*
  2. Cuando el cursor del raton se encuentra sobre el menu cambiamos el color a negro pero con una opacidad del 10%
  3. */
  4. .menu-bar > .container > .menu-button:hover{
  5. -fx-background-color: rgba(0,0,0, 0.1);
  6. }
  7. /*
  8. Cuando el usuario ha pinchado sobre el Menu y este muestra los Menu Items que tiene como hijos entonces
  9. cambiamos el color a un negro con una opacidad del 30%
  10. */
  11. .menu-bar > .container > .menu-button:showing{
  12. -fx-background-color: rgba(0,0,0, 0.3);
  13. }
  14.  

 

El resultado lo podemos observar en las siguientes imágenes:

 

Utilizando la pseudoclase hover:

Proyecto para darle estilo a la barra de menus en javafx con css


Utilizando la pseudoclase showing:

Proyecto para darle estilo a la barra de menus en javafx con css


Como se logra observar en la primera imagen en donde utilice la pseudoclase hover el color del menú cambio un verde mas oscuro debido al color negro con la opacidad de un 10%, en cambio en la imagen en donde utilice la pseudoclase showing el verde es aún más oscuro debido a que utilice un negro con una opacidad del 50%.

 

Hasta el momento solo le he dado estilo a la barra de menú y al menú que esta contiene sin embargo, al pinchar sobre ellos los nodos hijos que en esta caso son los menú ítems tienen el diseño por defecto que trae el sistema operativo. Para entender como funciona el despliegue de estos nodos hijos tenemos que saber que el evento que genera el click sobre el menú hace que se muestre un context menú el cual tiene dentro los menús ítems entonces a este vamos a darle el estilo de la barra de menú:

  1. /**
  2. Para acceder al context menu que muestra los menu items al pulsar sobre el menu-button accedemos a la clase css
  3. .context-menu
  4. */
  5. .context-menu{
  6. /*Le damos el color de fondo que tiene nuestra menu bar*/
  7. -fx-background-color: #00796B;
  8. /*Le damos un padding de 5*/
  9. -fx-padding: 5;
  10. /*Le damos un ancho minimo de 100*/
  11. -fx-min-width: 100;
  12. }
  13. .menu-item > .label{
  14. /*Cambiamos el color del texto*/
  15. -fx-text-fill: #FFFFFF;
  16. /*Cambiamos el tamaño de la fuente*/
  17. -fx-font-size: 14;
  18. /*Cambiamos el tipo de fuente Nota: en mi caso utilizo la fuente roboto porque la tengo
  19. instalada dentro de mi sistema operativo*/
  20. -fx-font-family: "Roboto";
  21. /*Colocamos el texto en negrita*/
  22. -fx-font-weight: bold;
  23. -fx-padding: 0;
  24. }
  25. .menu-item:hover{
  26. -fx-background-color: rgba(0,0,0, 0.1);
  27. }
  28. .menu-item:showing{
  29. -fx-background-color: rgba(0,0,0, 0.3);
  30. }
  31. .menu-item: focused{
  32. -fx-background-color: rgba(0,0,0, 0.3);
  33. }
  34.  

Proyecto para darle estilo a la barra de menus en javafx con css


Y ya con estos pasos podemos ir realizando diseños mas llamativos y de acorde a nuestras necesidades como desarrolladores.

A continuación, comparto el código completo del FXML y del archivo css.

Código FXML y código css.

Codigo FXML:


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <?import javafx.scene.control.Menu?>
  3. <?import javafx.scene.control.MenuBar?>
  4. <?import javafx.scene.control.MenuItem?>
  5. <?import javafx.scene.layout.BorderPane?>
  6. <BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" stylesheets="@MenuBar.css" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1">
  7. <top>
  8. <MenuBar BorderPane.alignment="CENTER">
  9. <menus>
  10. <Menu mnemonicParsing="false" text="File">
  11. <items>
  12. <MenuItem mnemonicParsing="false" text="Close" />
  13. </items>
  14. </Menu>
  15. <Menu mnemonicParsing="false" text="Edit">
  16. <items>
  17. <MenuItem mnemonicParsing="false" text="Delete" />
  18. </items>
  19. </Menu>
  20. <Menu mnemonicParsing="false" text="Help">
  21. <items>
  22. <MenuItem mnemonicParsing="false" text="About" />
  23. </items>
  24. </Menu>
  25. </menus>
  26. </MenuBar>
  27. </top>
  28. </BorderPane>

Codigo css:
  1. /*
  2. Para acceder a la menubar utilizamod la clase css menu-bar.
  3. Nota: en css de javafx hay muchas de las funciones del css
  4. para el desarrollo web que no son aplicables.
  5. */
  6. .menu-bar{
  7. /*Le damos un background color de verde azulado*/
  8. -fx-background-color: #00796B;
  9. /*Le damos un padding de 5 */
  10. -fx-padding: 5;
  11. }
  12. /*
  13. Para acceder a los Nodos Menu que contiene la barra de menus utilizamos
  14. la clase css .menu-button
  15. */
  16. .menu-button{
  17. /*
  18. En esta seccion colocariamos el codigo css que deseamos aplicar a nuestro
  19. nodo Menu
  20. */
  21. }
  22. /*
  23. Para acceder al Label que muestra el texto del Menu entonces lo hacemos de la siguiente forma
  24. .menu-bar > .container > . menu-button > .label
  25. de esta forma podemos cambiar el color, tamaño tipo de fuente, padding entre otras funciones
  26. cabe destacar que utilizando esta forma cambiaremos solamente los Label que se encuentran
  27. dentro de la barra de menus ya que si solo utilizamos la clase .label el codigo css afectaría
  28. a todos los Labels que contenga nuestro border pane
  29. para esta prueba le cambiaré el color de texto, el tamaño de la fuente el tipo de fuente y el
  30. tipo de letra
  31. */
  32. .menu-bar > .container > .menu-button >.label{
  33. /*Cambiamos el color del texto*/
  34. -fx-text-fill: #FFFFFF;
  35. /*Cambiamos el tamaño de la fuente*/
  36. -fx-font-size: 18;
  37. /*Cambiamos el tipo de fuente Nota: en mi caso utilizo la fuente roboto porque la tengo
  38. instalada dentro de mi sistema operativo*/
  39. -fx-font-family: "Roboto";
  40. /*Colocamos el texto en negrita*/
  41. -fx-font-weight: bold;
  42. }
  43. /*
  44. Cuando el cursor del raton se encuentra sobre el menu cambiamos el color a negro pero con una opacidad del 10%
  45. */
  46. .menu-bar > .container > .menu-button:hover{
  47. -fx-background-color: rgba(0,0,0, 0.1);
  48. }
  49. /*
  50. Cuando el usuario ha pinchado sobre el Menu y este muestra los Menu Items que tiene como hijos entonces
  51. cambiamos el color a un negro con una opacidad del 30%
  52. */
  53. .menu-bar > .container > .menu-button:showing{
  54. -fx-background-color: rgba(0,0,0, 0.3);
  55. }
  56. .menu-item > .label{
  57. /*Cambiamos el color del texto*/
  58. -fx-text-fill: #FFFFFF;
  59. /*Cambiamos el tamaño de la fuente*/
  60. -fx-font-size: 14;
  61. /*Cambiamos el tipo de fuente Nota: en mi caso utilizo la fuente roboto porque la tengo
  62. instalada dentro de mi sistema operativo*/
  63. -fx-font-family: "Roboto";
  64. /*Colocamos el texto en negrita*/
  65. -fx-font-weight: bold;
  66. -fx-padding: 0;
  67. }
  68. .menu-item:hover{
  69. -fx-background-color: rgba(0,0,0, 0.1);
  70. }
  71. .menu-item:showing{
  72. -fx-background-color: rgba(0,0,0, 0.3);
  73. }
  74. .menu-item: focused{
  75. -fx-background-color: rgba(0,0,0, 0.3);
  76. }
  77. /**
  78. Para acceder al context menu que muestra los menu items al pulsar sobre el menu-button accedemos a la clase css
  79. .context-menu
  80. */
  81. .context-menu{
  82. /*Le damos el color de fondo que tiene nuestra menu bar*/
  83. -fx-background-color: #00796B;
  84. /*Le damos un padding de 5*/
  85. -fx-padding: 5;
  86. /*Le damos un ancho minimo de 100*/
  87. -fx-min-width: 100;
  88. }

Comentarios

Entradas populares

Como dar estilo a un Scroll Pane de JavaFX utilizando CSS

Excepciones al utilizar HTMLEditor de JavaFx