Switch
Switch é um interruptor liga/desliga com trilho arredondado e um “thumb” (botão deslizante) que desliza entre os estados off e on de forma animada. Aceita um rótulo de texto opcional ao lado e ícones on/off que fazem crossfade na transição. É o controle ideal para ativar/desativar uma preferência imediata, no estilo iOS/Material.
🟢 · Pacote:
dev.crossfly.ui· Estende:Component(implementaCheckable,AlphaAnimation.Animate) · Estilo:SwitchStyle
Quando usar
- Ligar/desligar uma única preferência com efeito imediato (ex.: “Ativar notificações”).
- Onde o usuário espera um toggle visual e não uma caixa de marcação.
Quando NÃO usar
- Para escolher entre várias opções visíveis ao mesmo tempo → use
optiondentro de umgroup. - Para uma lista maior de escolhas → use
dropdown.
Aparência
Trilho arredondado (trackRadius = trackH/2) com um thumb quadrado que se move de thumbMinX (off) até thumbMaxX (on). Largura, altura do trilho e tamanho do thumb são proporcionais à altura da fonte (switchWidth, trackHeight, thumbSizeRatio do SwitchStyle). O rótulo opcional fica ao lado do interruptor; quando iconAlignH == END o switch vai à direita e o texto à esquerda, caso contrário o texto fica à direita.
Exemplo completo (copiar, colar e rodar)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
/** 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());
// Label que reflete o estado do switch
Label saida = new Label("Recurso: desligado");
add(LAY_AUTO, saida);
// Switch com rótulo; onAction só dispara quando o estado muda
Switch toggle = new Switch("Ativar recurso");
toggle.checked(false); // estado inicial, sem animação
toggle.onAction(c -> saida.setText("Recurso: " + (toggle.checked ? "ligado" : "desligado")));
add(LAY_AUTO, toggle);
}
}
Os trechos abaixo mostram só o miolo (o que vai dentro de
onShow()). Para rodar, coloque-os no esqueletoMainWindowacima.
Uso básico
Switch toggle = new Switch("Ativar recurso");
toggle.checked(true); // estado inicial, SEM animação
toggle.onAction(c -> System.out.println("estado: " + toggle.checked));
container.add(LAY_AUTO, toggle);
Construtores
| Construtor | Descrição |
|---|---|
Switch() |
Desmarcado, sem rótulo (modo somente-ícone). |
Switch(String text) |
Desmarcado, com rótulo ao lado. |
Propriedades e personalização
| Propriedade / método | Tipo | Padrão | O que faz |
|---|---|---|---|
text(String) |
Switch (fluente) |
null |
Define o rótulo. |
checked(boolean) |
Switch (fluente) |
false |
Estado inicial sem animação (ajusta progress direto); notifica o grupo. |
setChecked(boolean) |
void |
— | Estado com animação; notifica o grupo. |
toggle() |
void |
— | Alterna o estado (respeitando o grupo). |
checked |
boolean (campo) |
false |
Estado lógico atual (leitura). |
progress |
float (campo) |
0 |
Posição interpolada do thumb: 0 = off, 1 = on. |
.group(Group) |
Switch (fluente) |
— | Associa a um group para exclusão mútua. |
Callbacks e eventos
| Callback | Quando dispara |
|---|---|
onAction(Action) |
Em onTouchUp, apenas se o estado (checked) mudou. |
Estados
- checked / unchecked: controlado por
checked(boolean)(sem animação) ousetChecked(boolean)(com animação). O campocheckedreflete o estado. - em animação:
progresstransita de 0 a 1 (ou vice-versa) viaAlphaAnimation(duração =style.animationDuration). - em grupo:
toggle()não desmarca um switch já marcado que pertence a um grupo (comportamento de rádio).
Vários switches mutuamente exclusivos (rádio) num Group
Group modo = new Group();
Switch claro = new Switch("Tema claro").group(modo).checked(true);
Switch escuro = new Switch("Tema escuro").group(modo);
container.add(LAY_AUTO, claro);
container.add(LAY_AUTO, escuro);
// Marcar um desmarca o outro automaticamente.
Boas práticas
- Prefira
checked(boolean)para o estado inicial (ajustaprogresse o grupo de uma vez); usesetCheckedquando quiser a transição animada em runtime. - Leia o estado por
isChecked()ou pelo campocheckeddentro doonAction.
Erros comuns
- Esperar que
onActiondispare em toda interação: ele só dispara quandocheckedmuda. - Tentar “desligar” clicando num switch já marcado dentro de um
Group:toggle()impede isso (rádio).