Progress
Progress é um indicador de progresso com três modos mutuamente exclusivos, escolhidos no construtor (o campo mode é final): barra determinada (porcentagem conhecida), animação indeterminada infinita, ou ícone girando em loop. As animações iniciam ao ser adicionado (onAdd, exceto sob teste) e param ao ser removido (onRemove).
🟢 · Pacote:
dev.crossfly.ui· Estende:Component· Estilo:ProgressStyle
Quando usar
DETERMINATE_BAR: quando há uma porcentagem/valor conhecido a mostrar.INDETERMINATE/SPINNING_ICON: quando a duração é desconhecida (carregando…).
Quando NÃO usar
- Para o usuário escolher um valor arrastando → use
slider.
Aparência
Depende do modo (Progress.Mode) e, no indeterminado, do ProgressType:
ProgressType |
Visual |
|---|---|
IOS |
spinner circular (estilo iOS) |
FLUTTER |
indicador circular (timing easeInOut) |
MATERIAL |
barra linear Material (wrap contínuo) |
STRIPED |
barra listrada animada |
A barra é só horizontal; a altura é max(fontHeight * barHeight, 4). As cores vêm de filledColor/emptyColor do ProgressStyle.
Exemplo completo (copiar, colar e rodar)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.style.*; // Styles.progress()
import dev.crossfly.ui.graphics.*; // MaterialIcon
/** Tela principal executável. Aponte o launcher (classname) e rode: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
// 1) Barra determinada (0..100) preenchida em 75%
Progress barra = new Progress(0f, 100f);
barra.setValue(75f);
barra.style(Styles.progress().barHeight(1.5f));
add(LAY_AUTO, barra);
// 2) Barra indeterminada (Material) — anima sozinha ao ser adicionada
Progress material = new Progress(ProgressType.MATERIAL);
material.style(Styles.progress().barHeight(1.5f));
add(LAY_AUTO, material);
// 3) Ícone girando em loop
Progress spinner = new Progress(new MaterialIcon("autorenew", 48));
add(LAY_AUTO, spinner);
}
}
Os trechos abaixo mostram só o miolo (o que vai dentro de
onShow()). Para rodar, coloque-os no esqueletoMainWindowacima.
Uso básico
Progress barra = new Progress(0f, 100f); // modo DETERMINATE_BAR
barra.setValue(75f); // 75%
barra.style(Styles.progress().barHeight(1.5f));
container.add(0f, barra);
Construtores
| Construtor | Modo | Descrição |
|---|---|---|
Progress(float min, float max) |
DETERMINATE_BAR |
Barra proporcional a value (inicia em min). |
Progress(ProgressType type) |
INDETERMINATE |
Animação infinita (Material/Flutter/iOS/Striped). |
Progress(Icon icon) |
SPINNING_ICON |
Gira um ícone em loop contínuo. |
Propriedades e personalização
| Propriedade / método | Tipo | Padrão | O que faz |
|---|---|---|---|
setValue(float) |
Progress (fluente) |
— | Modo barra: define o valor (com clamp) e recalcula progress. |
mode |
Progress.Mode (campo, final) |
ctor | Modo de operação (leitura). |
value / min / max |
float (campo) |
ctor | Estado da barra determinada. |
progress |
float (campo) |
— | Progresso normalizado [0,1] (barra). |
pivot(int, int) |
Progress (fluente) |
-1,-1 |
Modo ícone: pivô de rotação (-1,-1 = auto-centro). |
Callbacks e eventos
Progress é não interativo: não expõe callbacks. Atualize a barra chamando setValue(...) conforme o trabalho avança.
Estados
- DETERMINATE_BAR:
setValue(v)fazclampem[min,max],progress = (value-min)/(max-min)efilledW = barW * progress. - INDETERMINATE / SPINNING_ICON:
LoopAnimationcontínua iniciada emonAdd, parada emonRemove.
Os três modos
// Barra determinada 0..50 com 35 preenchido
Progress bar = new Progress(0f, 50f);
bar.setValue(35f);
bar.style(Styles.progress().barHeight(1.5f));
container.add(0f, bar);
// Barra indeterminada (Material)
Progress material = new Progress(ProgressType.MATERIAL);
material.style(Styles.progress().barHeight(1.5f));
container.add(0f, material);
// Ícone girando
Progress spinner = new Progress(new MaterialIcon("autorenew", 48));
container.add(0f, spinner);
Boas práticas
- Use
DETERMINATE_BARsempre que souber a porcentagem; reserve o indeterminado para durações desconhecidas. - Customize cores via
filledColor/emptyColordo estilo em vez de subclassificar.
Erros comuns
- Chamar
setValueem modo indeterminado/spinner: não tem efeito visual útil (o valor só importa emDETERMINATE_BAR). - Esperar barra vertical ou texto de porcentagem embutido: a barra é só horizontal e sem rótulo prefix/suffix.