Technical Support
🟢 Online now
Hello 👋

How can we help you today?
Contact on WhatsApp
B4X Store
jdashboardUI / Núcleo y utilidades / JDashboardThemes
Núcleo y utilidades

JDashboardThemes

15 temas CSS con cambio inmediato en tiempo de ejecución para Forms y Panes

Buscar en toda jdashboardUI
Fuente
jdashboardUI.b4xlib · Solo API pública
Idioma de la tienda: es

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 ApplyToForm o ApplyToPane.
  • 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 RootPane para 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 ApplyToForm o ApplyToPane: el cambio es inmediato.
  • Prefiere las constantes públicas cuando el tema esté definido en código.
  • Usa GetAvailableThemes para construir selectores dinámicos.
  • Usa ThemeExists si 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.