Núcleo y utilidades · jdashboardUI 24.2 · B4J / JavaFX
JDashboardThemes es el sistema de temas comunes de jdashboardUI. Permite cambiar el aspecto de controles JavaFX de una aplicación completa o solo de una parte de la interfaz sin depender de jdashboard_WindowsStyle.
Lo más importante de JDashboardThemes
Cambio de tema inmediato en tiempo de ejecución. Puedes cambiar de Light a Dark, Nord, Dracula, Monokai, Ocean, etc. mientras la aplicación está abierta. No hay que reiniciar, volver a cargar el layout ni recrear el Form.
- 15 temas CSS incluidos listos para usar.
- Cambio visual en vivo / runtime con
ApplyToFormoApplyToPane. - Tema global para un Form completo.
- Tema limitado a un Pane y todo su subárbol.
- Preserva tus otros stylesheets; sustituye únicamente los temas gestionados por esta clase.
- Sincroniza el tema con
RootPanepara ayudar a que popup/context menus hereden el mismo aspecto. - Permite listar, resolver y validar temas antes de aplicarlos.
- No necesita
jdashboard_WindowsStyle.
Importante: está orientado a controles comunes JavaFX. Ribbon y otros componentes custom que administran su propio CSS o estilos inline conservan su sistema visual propio y no se cambian automáticamente con esta clase.
Cambio inmediato mientras la aplicación está ejecutándose
Este es uno de los puntos más importantes de la clase. Puedes conectar botones, menús o un ComboBox y cambiar el tema al instante:
Private Sub btnDark_Action
JDashboardThemes.ApplyToForm( _
MainForm, _
JDashboardThemes.THEME_FLUENT_DARK)
End Sub
Private Sub btnOcean_Action
JDashboardThemes.ApplyToForm( _
MainForm, _
JDashboardThemes.THEME_FLUENT_OCEAN)
End Sub
Private Sub btnMonokai_Action
JDashboardThemes.ApplyToForm( _
MainForm, _
JDashboardThemes.THEME_MONOKAI)
End Sub
Al ejecutar cualquiera de estas llamadas, el stylesheet administrado se reemplaza y se aplica en ese momento. El usuario ve el cambio sin cerrar la aplicación.
Uso recomendado al iniciar
Para evitar que aparezca un primer frame sin tematizar, aplica el tema antes de mostrar el Form:
Private MainForm As Form
Sub AppStart (Form1 As Form, Args() As String)
MainForm = Form1
MainForm.RootPane.LoadLayout("Main")
If JDashboardThemes.ApplyToForm( _
MainForm, _
JDashboardThemes.THEME_FLUENT_FOREST) = False Then
Log("Theme could not be applied")
End If
MainForm.Show
End Sub
También admite nombres cortos:
JDashboardThemes.ApplyToForm(MainForm, "dark")
JDashboardThemes.ApplyToForm(MainForm, "ocean")
JDashboardThemes.ApplyToForm(MainForm, "nord")
JDashboardThemes.ApplyToForm(MainForm, "tokyo night")
Los 15 temas incluidos
| Constante | Archivo CSS | Alias |
|---|---|---|
| THEME_FLUENT_LIGHT | fluent-light.css | light / fluent-light |
| THEME_FLUENT_DARK | fluent-dark.css | dark / fluent-dark |
| THEME_FLUENT_OCEAN | fluent-ocean.css | ocean / fluent-ocean |
| THEME_FLUENT_FOREST | fluent-forest.css | forest / fluent-forest |
| THEME_FLUENT_LILAC | fluent-lilac.css | lilac / fluent-lilac |
| THEME_DRACULA | dracula.css | dracula |
| THEME_CATPPUCCIN_MOCHA | catppuccin-mocha.css | catppuccin-mocha / catppuccin mocha |
| THEME_NORD | nord.css | nord |
| THEME_GRUVBOX | gruvbox.css | gruvbox |
| THEME_SOLARIZED_LIGHT | solarized-light.css | solarized-light / solarized light |
| THEME_SOLARIZED_DARK | solarized-dark.css | solarized-dark / solarized dark |
| THEME_ROSE_PINE | rose-pine.css | rose-pine / rose pine |
| THEME_TOKYO_NIGHT | tokyo-night.css | tokyo-night / tokyo night |
| THEME_ONE_DARK | one-dark.css | one-dark / one dark |
| THEME_MONOKAI | monokai.css | monokai |
El tema predeterminado es JDashboardThemes.DEFAULT_THEME, actualmente fluent-light.css.
Tematizar solamente un Pane
If JDashboardThemes.ApplyToPane( _
pnlEditor, _
JDashboardThemes.THEME_DRACULA) = False Then
Log("Could not theme editor pane")
End If
Esto permite, por ejemplo, tener un editor oscuro dentro de una ventana clara. El cambio también es inmediato en runtime.
Preserva otros CSS de tu aplicación
ApplyToForm y ApplyToPane no vacían la lista completa de stylesheets. Eliminan únicamente URLs que corresponden a uno de los temas gestionados por JDashboardThemes.
Por tanto puedes conservar:
mi-aplicacion.css
+
JDashboardThemes.THEME_NORD
y cambiar Nord por otro tema sin volver a cargar tu CSS propio.
PopupControls y menús contextuales
ApplyToForm aplica el tema tanto a Form.Stylesheets como a RootPane y ejecuta applyCss sobre el árbol.
Esto ayuda a que controles emergentes creados desde ese árbol —por ejemplo el menú contextual nativo de un TextField— tengan disponible el mismo tema cuando aparecen.
Selector de temas en vivo
Sub AppStart (Form1 As Form, Args() As String)
MainForm = Form1
MainForm.RootPane.LoadLayout("Main")
cmbTheme.Items.AddAll(JDashboardThemes.GetAvailableThemes)
cmbTheme.SelectedIndex = 0
JDashboardThemes.ApplyToForm(MainForm, cmbTheme.Items.Get(0))
MainForm.Show
End Sub
Private Sub cmbTheme_SelectedIndexChanged(Index As Int, Value As Object)
If Index < 0 Then Return
If JDashboardThemes.ApplyToForm(MainForm, Value) = False Then
Log("Theme was not applied: " & Value)
End If
End Sub
El cambio ocurre inmediatamente cada vez que el usuario selecciona otro tema.
GetAvailableThemes
Dim Themes As List = JDashboardThemes.GetAvailableThemes
For Each ThemeFile As String In Themes
Log(ThemeFile)
Next
Devuelve los 15 nombres CSS incluidos.
ThemeExists
If JDashboardThemes.ThemeExists("rose pine") Then
JDashboardThemes.ApplyToForm(MainForm, "rose pine")
End If
Comprueba que el nombre pueda resolverse y que el asset CSS realmente se pueda abrir desde File.DirAssets.
ResolveThemeFile
Log(JDashboardThemes.ResolveThemeFile("dark"))
' fluent-dark.css
Log(JDashboardThemes.ResolveThemeFile("tokyo night"))
' tokyo-night.css
Un nombre desconocido devuelve "". Null o una cadena vacía resuelven al tema predeterminado.
CurrentTheme y SetCurrentTheme
If JDashboardThemes.SetCurrentTheme("gruvbox") Then
Log(JDashboardThemes.CurrentTheme)
End If
SetCurrentTheme no cambia visualmente el Form por sí solo. Solo valida y almacena el tema. Para cambiar la interfaz en vivo usa ApplyToForm o ApplyToPane.
Quitar un tema administrado
JDashboardThemes.RemoveFromForm(MainForm)
JDashboardThemes.RemoveFromPane(pnlEditor)
Solo elimina los temas gestionados por esta clase; los CSS externos permanecen.
API pública completa
| Método | Retorno | Uso |
|---|---|---|
| ApplyToForm(TargetForm As Form, ThemeName As String) | Boolean | Aplicar inmediatamente un tema al Form |
| ApplyToPane(TargetPane As Pane, ThemeName As String) | Boolean | Aplicar inmediatamente un tema a un Pane |
| SetCurrentTheme(ThemeName As String) | Boolean | Validar y cambiar CurrentTheme |
| RemoveFromForm(TargetForm As Form) | - | Quitar temas gestionados del Form |
| RemoveFromPane(TargetPane As Pane) | - | Quitar temas gestionados del Pane |
| GetAvailableThemes | List | Obtener los 15 CSS incluidos |
| ThemeExists(ThemeName As String) | Boolean | Validar nombre y asset |
| ResolveThemeFile(ThemeName As String) | String | Resolver alias o archivo CSS |
Estado y ciclo de vida
JDashboardThemes es StaticCode:
- no necesita
Initialize; - no crea Views;
- no tiene Designer Properties;
- no declara eventos;
- no necesita
AddToParent; - expone
CurrentTheme; - utiliza los CSS incluidos en los assets de jdashboardUI.
Buenas prácticas
- Aplica el tema inicial antes de
Form.Show. - Para cambios posteriores, llama a
ApplyToFormoApplyToPane: el cambio es inmediato. - Prefiere las constantes públicas cuando el tema esté definido en código.
- Usa
GetAvailableThemespara construir selectores dinámicos. - Usa
ThemeExistssi el nombre viene de preferencias o configuración externa. - No borres manualmente todos los stylesheets; deja que la clase reemplace únicamente los suyos.
- Recuerda que Ribbon y otros componentes custom pueden necesitar su propia API de temas.