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
Listen 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
TextAreay otros Nodes. - Conversión de iconos/fuentes a bitmap.
- Bitmaps circulares y rectangulares con bordes redondeados.
- Creación por código de
CustomListView,JImageViewyLabel. - 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, agregaImage1.mBaseal á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:
- convierte la ruta a URL;
- crea
org.xhtmlrenderer.pdf.ITextRenderer; - carga el documento;
- ejecuta
layout; - crea el PDF;
- 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 ObjectcalcValue(Action, TableName, Column, sql) As ObjectCalculateMedian(list As List) As StringcalcValue2(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 IntMeasureTextHeight(Text, Font1) As IntMeasureTextHeightWithWrap(Text, Font1, MaxWidth) As Float
Colores
intToHex(clr) As StringHexToInt(Hex) As Intcolortobackcolor(color, ajust) As IntGetIntContrastColor(...) As IntGetPaintContrastColor(...) As PaintCompareAndGenerateRandomColor(color1, color2) As IntSetAlphaToIntColor(color, newalpha) As IntSetAlphaToPaintColor(color, alpha) As PaintrgbaToColor(rgba) As Int
TableView
SetTableHeaderWrap(Table, PrefHeight)SetTableWidth(table, width)SetAutoTableWidth(table)
Bitmaps e imágenes
FontToBitmap(...) As B4XBitmapCreateRoundBitmap(...) As B4XBitmapCreateRoundRectBitmap(...) As B4XBitmapCreateJImageView(width, height) As JImageView
Otros componentes
AddforCode_Customlistview(...)ValidateEmail(EmailAddress) As Boolean
ConvertHTMLToPDF(htmlFilePath, pdfFilePath) As BooleanConvertTextHTMLToPDF(htmlText, pdfFilePath) As Boolean
Buenas prácticas
- Usa
jdashboardUtilsdirectamente; no intentes inicializarlo. - Para
calcValue/calcValue2, utiliza nombres de tabla y campo controlados por la aplicación. - Evita usar
calcValue2con texto procedente directamente del usuario. - Comprueba que una lista tenga elementos antes de
CalculateMedian. - Comprueba
ColumnsCount > 0antes deSetAutoTableWidth. - Recuerda que
SetShadowpuede sustituir estilos inline del Node en B4J. - Para
CreateJImageView, agregamBaseal layout. - Para PDF usa HTML/XHTML bien formado y comprueba el Boolean devuelto.