Esta página fue traducida automáticamente del portugués y puede contener errores. La versión en portugués es la canónica.
Charts (ChartView + subclases)
El módulo dev.crossfly.ui.chart tiene un núcleo de renderizado compartido (ChartView, que extiende
Component) y 8 subclases concretas que son los puntos de entrada recomendados — cada una
preconfigura el tipo y expone métodos fluidos ergonómicos:
| Clase | Tipo | Cómo añade datos |
|---|---|---|
LineChart |
línea | .withSeries(nome, valores[, cor]) |
AreaChart |
línea con área rellena (extiende LineChart) |
.withSeries(...) · .areaOpacity(int) |
BarChart |
barras agrupadas | .withSeries(...) |
StackedBarChart |
barras apiladas | .series(nome, valores[, cor]) |
StackedAreaChart |
áreas apiladas (gradiente) | .series(...) · .areaOpacity(int) |
PieChart |
tarta | .slice(nome, valor[, cor]) |
DonutChart |
rosca | .slice(...) · .hole(float) |
ComboChart |
barras + línea (eje Y secundario) | .addBarSeries(...) · .addLineSeries(...) |
🟡 · Paquete:
dev.crossfly.ui.chart· Extiende:Component· Estilo:ComponentStyle⚠️ Renombrado 2026: las antiguas clases
LineChartView/BarChartView/PieChartView/DonutChartView/ComboChartViewfueron renombradas aLineChart/BarChart/PieChart/DonutChart/ComboChart(sufijoVieweliminado). Y tarta/rosca ahora usanslice(...)(nowithSlice).
Cuándo usar
- Tendencias por categoría (línea/área), magnitudes (barra), composición a lo largo del tiempo (apilado), proporción de un todo (tarta/rosca), o magnitud + tasa juntas (combo).
Cuándo NO usar
- Dispersión XY con X arbitrario, 3D o velocímetro → no soportados. Dibujo libre →
whiteboard.
Ejemplo completo (copiar, pegar y ejecutar)
En CrossFly escribes una clase Window (la pantalla principal) — el Main y el launcher son
boilerplate de la plataforma. Apunta el launcher a esta clase (parámetro classname) y ejecuta
gradlew :lwjgl3:run:
package com.exemplo;
import dev.crossfly.ui.*; // Window, Component, LAY_FILL…
import dev.crossfly.ui.layout.*; // VerticalLayout
import dev.crossfly.ui.chart.*; // ChartView, LineChart…
/**
* Pantalla principal ejecutable. Apunte el launcher a esta clase (classname)
* y ejecute: gradlew :lwjgl3:run
*/
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
LineChart line = new LineChart();
line.withSeries("Revenue", new double[]{42, 55, 51, 68, 73, 88}, 0xFF42A5F5)
.withSeries("Target", new double[]{40, 50, 56, 60, 70, 82}, 0xFFAB47BC);
line.title("Receita por mês");
line.categories(new String[]{"Jan", "Feb", "Mar", "Apr", "May", "Jun"});
line.smooth(true); // Catmull-Rom
line.yAxis(0, 100, 5); // rango Y fijo (o autoYAxis())
add(LAY_FILL, line);
}
}
Los fragmentos siguientes muestran solo el núcleo (lo que va dentro de
onShow()), para centrarse en la funcionalidad. Para ejecutarlos, coloca el núcleo dentro del esqueletoMainWindowde arriba.
Uso básico (por subclase — recomendado)
LineChart line = new LineChart();
line.withSeries("Revenue", new double[]{42, 55, 51, 68, 73, 88}, 0xFF42A5F5)
.withSeries("Target", new double[]{40, 50, 56, 60, 70, 82}, 0xFFAB47BC);
line.title("Receita por mês");
line.categories(new String[]{"Jan", "Feb", "Mar", "Apr", "May", "Jun"});
line.smooth(true); // Catmull-Rom
line.yAxis(0, 100, 5); // rango Y fijo (o autoYAxis())
add(LAY_FILL, line);
Barra y barra apilada
BarChart bar = new BarChart();
bar.withSeries("North", new double[]{120, 140, 138, 165}, 0xFF5C6BC0)
.withSeries("South", new double[]{95, 110, 123, 131}, 0xFF26C6DA);
bar.title("Vendas trimestrais").categories(new String[]{"Q1", "Q2", "Q3", "Q4"});
StackedBarChart stacked = new StackedBarChart();
stacked.series("Direct", new double[]{6.2, 13.7, 19.9, 8}, 0xFF1976D2)
.series("Mail Ad", new double[]{18.2, 11, 8, 17.8}, 0xFF81C784);
stacked.yAxis(0, 100, 5);
Área y área apilada
AreaChart area = new AreaChart();
area.withSeries("Load", new double[]{180, 260, 210, 300, 280}, 0xFF26C6DA);
area.areaOpacity(110); // alpha 0–255 del relleno
StackedAreaChart sarea = new StackedAreaChart();
sarea.series("Line 1", new double[]{140, 232, 101, 264}, 0xFF6DDB92)
.series("Line 2", new double[]{120, 282, 111, 234}, 0xFF00D4FF);
sarea.areaOpacity(210);
sarea.decimals = 0; // campos públicos para ajuste fino
Tarta y rosca
PieChart pie = new PieChart();
pie.slice("Organic", 38, 0xFF42A5F5)
.slice("Paid", 24, 0xFFAB47BC)
.slice("Social", 20, 0xFF26A69A);
pie.title("Fontes de tráfego");
DonutChart donut = new DonutChart();
donut.slice("Organic", 38).slice("Paid", 24).slice("Social", 20)
.hole(0.58f); // radio del agujero [0..0.95]
Combo (barras + línea en eje secundario)
ComboChart combo = new ComboChart();
combo.addBarSeries("Sessions", new double[]{1000, 1250, 1180, 1340}, 0xFF90CAF9)
.addLineSeries("Conversion %", new double[]{2.8, 3.1, 2.9, 3.4}, 0xFF1E88E5); // eje Y derecho
combo.title("Conversão x Sessões").yAxis(0, 1600, 8);
Modelo de datos
ChartView.Series(cartesiano):new Series(nome, double[] valores[, cor]); los fluidos.line()/.bar()definen elrenderMode(usado en el combo).ChartView.PieSlice(radial):new PieSlice(nome, double valor[, cor]).- Color
0= automático (paletaDEFAULT_COLORS, 9 colores). Para color fijo usa ARGB con alpha (0xFF…).
Configuración (campos públicos + fluidos)
| Miembro | Tipo | Por defecto | Qué hace |
|---|---|---|---|
title(String) · categories(String[]) |
fluido | — | título / etiquetas del eje X |
yAxis(min, max, steps) · autoYAxis() |
fluido | auto | rango del eje Y |
smooth(bool) / smoothLines |
fluido/campo | false |
interpolación Catmull-Rom |
area(bool) / showArea |
fluido/campo | false |
rellena el área bajo la línea |
areaOpacity(int) / areaAlpha |
fluido/campo | 0x55 |
alpha (0–255) del relleno |
showLegend/showGrid/showTitle/showPoints/showValues |
campo | true |
flags de visualización |
decimals |
campo | 2 |
decimales en etiquetas/tooltips |
axisColor/axisTextColor/legendTextColor/gridColor |
campo | tema | colores (ARGB) |
pointRadius/lineThickness/barInnerGap/splineSteps |
campo | — | ajuste fino del dibujo |
donutHoleRatio / hole(float) |
campo/fluido | 0.56 |
agujero de la rosca |
enableHoverSelection/enableInteractionAnimations |
campo | true |
selección por hover / animación de realce |
Tras cambiar campos públicos fuera de un método fluido, llama a
repaint().
Callbacks y estados
onAction(Action)se dispara al cambiar la selección (punto/barra/porción) — víarunActions(). LeeselectedSeries+selectedIndex(cartesiano) oselectedSlice(radial);-1= nada.- Interacción por
onTouchUp(selecciona el más cercano) yonHover(realza bajo el cursor). No hayonClick.
Estilo
Como cualquier Component: chart.getStyle().backColor(...)/borderColor(...); usa .copy() para
derivar sin mutar el compartido:
chart.style(chart.getStyle().copy().backColor(0xFFFFFFFF).borderColor(0xFFE0E0E0));
Buenas prácticas
- Prefiere la subclase concreta (
LineChart,BarChart…) alChartViewcrudo — los métodos fluidos son más claros. - Cartesiano usa
series/withSeries; radial usaslices/slice— no los mezcles en el mismo tipo. - Fija
yAxis(min,max,steps)para ejes estables (el modo automático incluye el cero y puede “aplanar”).
Errores comunes
- Usar los nombres antiguos
LineChartView/PieChartView… (renombrados) owithSlice(ahoraslice). - Pasar color
0x00…esperando negro:0es “automático” y alpha00es invisible — usa0xFF000000. - Esperar
onClick: la interacción es víaonActiondisparado por selección/hover.
Ver también
ui/·cookbook/·whiteboard