Technical Support
🟢 Online now
Hello 👋

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

jdashboardUtils

38 helpers estáticos para datos, colores, JavaFX, texto, tablas, imágenes, Views y PDF

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

Core & Utilities · jdashboardUI 23.5 · B4J / JavaFX

jdashboardUtils es un módulo StaticCode con utilidades reutilizables para interfaz, colores, texto, tablas, imágenes, SQL, validaciones, posición de Views y conversión HTML → PDF.

No necesita Initialize y se usa directamente:

Dim Width As Int = jdashboardUtils.MeasureTextWidth("Hello", xui.CreateDefaultFont(14))

La versión analizada expone 38 Subs públicas.

Características destacadas

  • Cálculos SQL: promedio, máximo, mínimo, suma, conteo y mediana.
  • Mediana de una List en memoria.
  • Medición de texto con y sin wrapping.
  • Conversión y manipulación de colores ARGB / HEX / RGBA.
  • Selección automática de color de contraste.
  • Transparencia y generación de colores relacionados.
  • Sombras y glow para nodos JavaFX.
  • Botones con imagen o icono.
  • Tooltips con imagen o icono.
  • Helpers de TableView: ancho de columnas y encabezados con wrap.
  • Estilizado rápido de TextArea y otros Nodes.
  • Conversión de iconos/fuentes a bitmap.
  • Bitmaps circulares y rectangulares con bordes redondeados.
  • Creación por código de CustomListView, JImageView y Label.
  • Validación de email.
  • Cálculo de posición absoluta aproximada de una View.
  • Conversión de HTML a PDF mediante Flying Saucer + iText.
  • API estática: ideal como caja de herramientas compartida.

Uso básico

Al ser StaticCode, no se instancia:

Private Sub TestUtils
    Dim c As Int = jdashboardUtils.HexToInt("#35C48D")
    Log(jdashboardUtils.intToHex(c))

    Dim Valid As Boolean = jdashboardUtils.ValidateEmail("user@example.com")
    Log(Valid)
End Sub

No tiene Designer Properties, eventos ni AddToParent.


1. Cálculos SQL

calcValue

Calcula un agregado sobre una columna SQLite.

Acciones admitidas:

avg
max
min
sum
count
median

Ejemplo:

Private SQL1 As SQL

SQL1.InitializeSQLite(File.DirApp, "shop.db", True)

Dim Total As Object = jdashboardUtils.calcValue( _
    "sum", _
    "products", _
    "price", _
    SQL1)

Log(Total)

Otros ejemplos:

Log(jdashboardUtils.calcValue("avg", "products", "price", SQL1))
Log(jdashboardUtils.calcValue("max", "products", "price", SQL1))
Log(jdashboardUtils.calcValue("min", "products", "price", SQL1))
Log(jdashboardUtils.calcValue("count", "products", "price", SQL1))
Log(jdashboardUtils.calcValue("median", "products", "price", SQL1))

Si el objeto SQL no está inicializado devuelve -1.

Importante: nombres SQL confiables

TableName y Column se concatenan directamente en la consulta.

Úsalos solamente con nombres de tabla/campo conocidos por tu aplicación:

Dim AllowedColumns As List = Array As String("price", "quantity", "total")
If AllowedColumns.IndexOf(ColumnName) = -1 Then Return

No pases nombres de tabla o columna recibidos directamente desde un usuario.


calcValue2

Añade un filtro por valor:

Dim Result As Object = jdashboardUtils.calcValue2( _
    "count", _
    "products", _
    "status", _
    "Active", _
    SQL1)

Admite las mismas acciones:

avg, max, min, sum, count, median.

Precaución adicional

La implementación actual concatena también value dentro de SQL.

Por eso calcValue2 debe usarse únicamente con datos controlados o previamente validados. No es un sustituto de ExecQuery2 para entrada externa.


CalculateMedian

Calcula la mediana de una lista en memoria:

Dim Values As List
Values.Initialize2(Array As Double(5, 9, 2, 10, 7))

Dim Median As String = jdashboardUtils.CalculateMedian(Values)
Log(Median) '7

Para cantidad par:

Dim Values As List
Values.Initialize2(Array As Double(2, 4, 8, 10))
Log(jdashboardUtils.CalculateMedian(Values)) '6

La función copia y ordena la lista, por lo que no cambia el orden de la lista original.

La lista debe contener valores numéricos y no debe estar vacía.

El tipo público de retorno es String, aunque el cálculo interno usa Double.


valueformated

Dim Value As Object = jdashboardUtils.valueformated("123")

En la versión actual simplemente devuelve el valor recibido. Se conserva como helper/API de compatibilidad.


2. Medición de texto

MeasureTextWidth

Dim Font1 As B4XFont = xui.CreateDefaultFont(14)
Dim W As Int = jdashboardUtils.MeasureTextWidth("Dashboard", Font1)

En B4J utiliza javafx.scene.text.Text y sus layout bounds.


MeasureTextHeight

Dim H As Int = jdashboardUtils.MeasureTextHeight( _
    "Line 1" & CRLF & "Line 2", _
    xui.CreateDefaultFont(14))

Útil para calcular tamaños dinámicos de labels, tooltips o paneles.


MeasureTextHeightWithWrap

Mide la altura considerando un ancho máximo:

Dim H As Float = jdashboardUtils.MeasureTextHeightWithWrap( _
    "A long paragraph that should wrap automatically.", _
    xui.CreateDefaultFont(14), _
    220dip)

En B4J configura setWrappingWidth sobre un Text temporal.

Si ocurre un error utiliza como fallback:

MeasureTextHeight(...) * 1.5

3. Colores

intToHex

Dim Hex As String = jdashboardUtils.intToHex(0xFF35C48D)
Log(Hex)

Convierte un color entero a texto hexadecimal apto para CSS/utilidades internas.


HexToInt

Dim Color As Int = jdashboardUtils.HexToInt("#35C48D")

Se usa ampliamente en otros módulos de jdashboardUI, por ejemplo JTableview y sus temas.


colortobackcolor

Crea una variante más oscura restando el valor indicado a R/G/B:

Dim Darker As Int = jdashboardUtils.colortobackcolor(0xFF35C48D, 20)

Los componentes se limitan automáticamente al rango 0–255.

Esta función se utiliza, por ejemplo, para crear gradientes de botones.


GetIntContrastColor

Escoge uno de dos colores basándose en luminosidad YIQ:

Dim TextColor As Int = jdashboardUtils.GetIntContrastColor( _
    PanelColor, _
    xui.Color_Black, _
    xui.Color_White)

El cálculo es:

YIQ = R * 0.299 + G * 0.587 + B * 0.114

Si YIQ > 200 devuelve ForLightColor; si no, ForDarkColor.

Una forma práctica de usarlo es pasar texto oscuro como ForLightColor y texto claro como ForDarkColor.


GetPaintContrastColor

Versión equivalente para Paint:

Dim P As Paint = jdashboardUtils.GetPaintContrastColor( _
    BackColor, _
    fx.Colors.Black, _
    fx.Colors.White)

SetAlphaToIntColor

Dim SemiTransparent As Int = jdashboardUtils.SetAlphaToIntColor( _
    0xFF35C48D, _
    128)

newalpha usa rango 0–255.


SetAlphaToPaintColor

Dim P As Paint = jdashboardUtils.SetAlphaToPaintColor( _
    fx.Colors.Red, _
    100)

Devuelve un nuevo Paint.


rgbaToColor

Dim Color As Int = jdashboardUtils.rgbaToColor("rgba(255, 0, 0, 0.5)")

El alpha de 0–1 se transforma a 0–255.

La función espera el formato:

rgba(r, g, b, a)

CompareAndGenerateRandomColor

Genera un color cercano al promedio de dos colores y añade una variación aleatoria de hasta ±20 por canal:

Dim NewColor As Int = jdashboardUtils.CompareAndGenerateRandomColor( _
    xui.Color_Blue, _
    xui.Color_Green)

El color resultante usa alpha 255.

Es útil para generar variaciones de una paleta, pero no es determinista.


4. Sombras, Glow y estilo visual

SetShadow

jdashboardUtils.SetShadow( _
    pnlCard, _
    8, _
    fx.Colors.Black)

En B4J genera un efecto CSS dropshadow(gaussian,...).

Importante en B4J

La implementación actual llama a:

Node.setStyle(css)

Por tanto puede reemplazar otros estilos inline previamente asignados al nodo.

Si el control tiene estilo inline importante, aplica la sombra antes de otros estilos o vuelve a aplicar esos estilos después.


ApplyGlow

jdashboardUtils.ApplyGlow( _
    lblTitle, _
    fx.Colors.Cyan, _
    15, _
    0.4)

En B4J genera:

dropshadow(three-pass-box, color, radius, spread, 0, 0)

y lo aplica mediante CSSUtils.SetStyleProperty.

Spread suele usarse entre 0 y 1.


customtextarea

jdashboardUtils.customtextarea( _
    txtDescription, _
    fx.Colors.From32Bit(0xFF101827), _
    fx.Colors.White)

Configura:

  • background;
  • text fill;
  • inner background transparente;
  • prompt text;
  • faint focus transparente.

customNode

jdashboardUtils.customNode( _
    txtSearch, _
    fx.Colors.From32Bit(0xFF101827), _
    10)

Aplica fondo, transparencia interna y borde con corner radius.


SetPanelCornerRadius

Permite activar el radio por esquina:

jdashboardUtils.SetPanelCornerRadius( _
    pnlCard, _
    14, _
    True,  _
    True,  _
    False, _
    False)

Orden:

TopLeft
TopRight
BottomLeft
BottomRight

En B4J configura -fx-background-radius con cuatro valores.


5. Botones con imágenes e iconos

ButtonSetImage2

jdashboardUtils.ButtonSetImage2( _
    btnSave, _
    File.DirAssets, _
    "save.png", _
    0xFF2563EB, _
    24dip, _
    "LEFT")

La función:

  • crea un JImageView;
  • carga la imagen;
  • configura tamaño;
  • usa FILL_NO_DISTORTIONS;
  • asigna cursor HAND;
  • coloca el graphic;
  • crea un fondo con gradiente.

Valores de Position admitidos por JavaFX ContentDisplay incluyen:

LEFT
RIGHT
TOP
BOTTOM
CENTER
GRAPHIC_ONLY
TEXT_ONLY

Usa nombres válidos de ContentDisplay.valueOf.


ButtonSeticon2

Igual que el anterior, pero usa un carácter/icono y una fuente:

Dim IconFont As Font = fx.CreateFont("FontAwesome", 18, False, False)

jdashboardUtils.ButtonSeticon2( _
    btnEdit, _
    Chr(0xF044), _
    fx.Colors.White, _
    IconFont, _
    0xFF258A61, _
    "LEFT")

Muy útil con FontAwesome, Material Icons u otras icon fonts.


6. Tooltips enriquecidos

ToolTip

Tooltip con imagen + texto:

jdashboardUtils.ToolTip( _
    btnInfo, _
    "This action creates a new project and prepares the initial files.", _
    File.DirAssets, _
    "info.png", _
    32dip, _
    32dip)

El texto se divide internamente aproximadamente cada 40 caracteres y se activa wrapping.


ToolTip2

Tooltip con icono + texto:

Dim IconFont As Font = fx.CreateFont("FontAwesome", 18, False, False)

jdashboardUtils.ToolTip2( _
    btnUser, _
    "Open user profile", _
    IconFont, _
    Chr(0xF007), _
    fx.Colors.DodgerBlue)

También usa un ancho lógico aproximado de 40 caracteres para el wrapping.


7. TableView

SetTableHeaderWrap

Activa wrapping en labels de encabezado:

Dim NativeTable As JavaObject = TableView1
jdashboardUtils.SetTableHeaderWrap(NativeTable, 42dip)

Si no quieres forzar altura:

jdashboardUtils.SetTableHeaderWrap(NativeTable, -1)

La implementación busca TableHeaderRow y configura cada Label.


SetTableWidth

Asigna el mismo ancho a todas las columnas:

jdashboardUtils.SetTableWidth(TableView1, 150dip)

SetAutoTableWidth

Distribuye el PrefWidth entre todas las columnas:

jdashboardUtils.SetAutoTableWidth(TableView1)

La fórmula actual es aproximadamente:

(Table.PrefWidth / ColumnsCount) - 5

El TableView debe tener al menos una columna y un PrefWidth útil antes de llamar al método.


8. Bitmaps e imágenes

FontToBitmap

Convierte texto/icono de una fuente a bitmap 32×32:

Dim Icon As B4XBitmap = jdashboardUtils.FontToBitmap( _
    Chr(0xF013), _
    xui.CreateFontAwesome(20), _
    20, _
    xui.Color_White)

Útil para transformar icon fonts en imágenes.


CreateRoundBitmap

Dim Avatar As B4XBitmap = jdashboardUtils.CreateRoundBitmap( _
    OriginalBitmap, _
    96dip, _
    xui.Color_White)

Si la imagen no es cuadrada, primero recorta el centro al mayor cuadrado posible.

Después:

  • redimensiona a Size × Size;
  • aplica clipping circular;
  • dibuja borde de 3dip.

CreateRoundRectBitmap

Dim Preview As B4XBitmap = jdashboardUtils.CreateRoundRectBitmap( _
    OriginalBitmap, _
    16dip, _
    xui.Color_White)

Conserva las dimensiones originales y usa un borde interno de 4dip.


CreateJImageView

Dim Image1 As JImageView = jdashboardUtils.CreateJImageView(200dip, 120dip)

Image1.Load(File.DirAssets, "photo.jpg")
Root.AddView(Image1.mBase, 20dip, 20dip, 200dip, 120dip)

Configuración inicial:

Round = False
ResizeMode = FILL_NO_DISTORTIONS
BackgroundColor = Transparent
CornersRadius = 0

La función devuelve el objeto JImageView. Para mostrarlo, agrega Image1.mBase al árbol visual.


9. Crear Views por código

CreateLabel

Dim lbl As B4XView = jdashboardUtils.CreateLabel("Title")

lbl.Text = "Dashboard"
lbl.TextSize = 18
lbl.TextColor = xui.Color_White

Root.AddView(lbl, 20dip, 20dip, 200dip, 40dip)

El Label se crea con alineación:

CENTER_LEFT

AddforCode_Customlistview

Permite inicializar un CustomListView manualmente:

Private CLV1 As CustomListView

Private Sub CreateList(Host As B4XView)
    jdashboardUtils.AddforCode_Customlistview( _
        Host, _
        CLV1, _
        "CLV1", _
        True, _
        "Vertical", _
        1dip)
End Sub

El helper prepara internamente las Designer Properties necesarias.

Valores habituales de orientación:

Vertical
Horizontal

10. Validación

ValidateEmail

If jdashboardUtils.ValidateEmail(txtEmail.Text) Then
    Log("Valid")
Else
    Log("Invalid")
End If

Usa una expresión regular para una validación sintáctica razonable.

No comprueba que el dominio exista ni que el buzón pueda recibir correo.


11. Posición de una View

ViewScreenPositionLetfButtom

El nombre público se conserva exactamente así:

ViewScreenPositionLetfButtom

Ejemplo:

Dim Pos() As Int = jdashboardUtils.ViewScreenPositionLetfButtom(btnMenu)

Dim Left As Int = Pos(0)
Dim Bottom As Int = Pos(1)

Log("Left=" & Left & " Bottom=" & Bottom)

Recorre la jerarquía de padres y devuelve:

Index 0 -> Left
Index 1 -> Bottom

Puede ser útil para posicionar menús flotantes, tooltips o popups respecto a una View.


12. HTML → PDF

jdashboardUtils incluye dos helpers basados en Flying Saucer + iText.

La librería 23.5 declara estas dependencias:

flying-saucer-core-9.1.22.jar
flying-saucer-pdf-itext5-9.1.22.jar
flying-saucer-pdf-9.1.22.jar
itextpdf-5.5.13.2.jar

ConvertHTMLToPDF

Convierte un archivo HTML existente:

Dim HtmlPath As String = File.Combine(File.DirApp, "invoice.html")
Dim PdfPath As String = File.Combine(File.DirApp, "invoice.pdf")

If jdashboardUtils.ConvertHTMLToPDF(HtmlPath, PdfPath) Then
    Log("PDF created")
Else
    Log("PDF conversion failed")
End If

La función:

  1. convierte la ruta a URL;
  2. crea org.xhtmlrenderer.pdf.ITextRenderer;
  3. carga el documento;
  4. ejecuta layout;
  5. crea el PDF;
  6. cierra el output stream.

Devuelve True o False.


ConvertTextHTMLToPDF

Convierte directamente un String HTML:

Dim Html As String = $"<html>
<body>
    <h1>Invoice</h1>
    <p>Generated from B4J.</p>
</body>
</html>"$

Dim PdfPath As String = File.Combine(File.DirApp, "invoice.pdf")

If jdashboardUtils.ConvertTextHTMLToPDF(Html, PdfPath) Then
    Log("PDF created")
End If

Internamente el texto se convierte a UTF-8 y se carga con XMLResource.

XHTML válido

Flying Saucer trabaja mejor con HTML/XHTML bien formado.

Para documentos complejos usa estructura completa:

<html>
<head>
    <meta charset="UTF-8" />
    <style>
        body { font-family: sans-serif; }
    </style>
</head>
<body>
    ...
</body>
</html>

API pública completa

Datos y cálculos

  • valueformated(value As String) As Object
  • calcValue(Action, TableName, Column, sql) As Object
  • CalculateMedian(list As List) As String
  • calcValue2(Action, TableName, Column, value, sql) As Object

Efectos y Views

  • SetShadow(View, Offset, Color)
  • ApplyGlow(View, Color, Radius, Spread)
  • customtextarea(TextArea, Background, TextColor)
  • customNode(node, Background, cornerradius)
  • SetPanelCornerRadius(...)
  • ViewScreenPositionLetfButtom(view) As Int()
  • CreateLabel(EventName1) As B4XView

Botones y tooltips

  • ButtonSetImage2(...)
  • ButtonSeticon2(...)
  • ToolTip(...)
  • ToolTip2(...)

Texto

  • MeasureTextWidth(Text, Font1) As Int
  • MeasureTextHeight(Text, Font1) As Int
  • MeasureTextHeightWithWrap(Text, Font1, MaxWidth) As Float

Colores

  • intToHex(clr) As String
  • HexToInt(Hex) As Int
  • colortobackcolor(color, ajust) As Int
  • GetIntContrastColor(...) As Int
  • GetPaintContrastColor(...) As Paint
  • CompareAndGenerateRandomColor(color1, color2) As Int
  • SetAlphaToIntColor(color, newalpha) As Int
  • SetAlphaToPaintColor(color, alpha) As Paint
  • rgbaToColor(rgba) As Int

TableView

  • SetTableHeaderWrap(Table, PrefHeight)
  • SetTableWidth(table, width)
  • SetAutoTableWidth(table)

Bitmaps e imágenes

  • FontToBitmap(...) As B4XBitmap
  • CreateRoundBitmap(...) As B4XBitmap
  • CreateRoundRectBitmap(...) As B4XBitmap
  • CreateJImageView(width, height) As JImageView

Otros componentes

  • AddforCode_Customlistview(...)
  • ValidateEmail(EmailAddress) As Boolean

PDF

  • ConvertHTMLToPDF(htmlFilePath, pdfFilePath) As Boolean
  • ConvertTextHTMLToPDF(htmlText, pdfFilePath) As Boolean

Buenas prácticas

  • Usa jdashboardUtils directamente; no intentes inicializarlo.
  • Para calcValue / calcValue2, utiliza nombres de tabla y campo controlados por la aplicación.
  • Evita usar calcValue2 con texto procedente directamente del usuario.
  • Comprueba que una lista tenga elementos antes de CalculateMedian.
  • Comprueba ColumnsCount > 0 antes de SetAutoTableWidth.
  • Recuerda que SetShadow puede sustituir estilos inline del Node en B4J.
  • Para CreateJImageView, agrega mBase al layout.
  • Para PDF usa HTML/XHTML bien formado y comprueba el Boolean devuelto.