Esta página fue traducida automáticamente del portugués y puede contener errores. La versión en portugués es la canónica.
Slider
Slider permite elegir un valor float dentro de un intervalo [min, max] arrastrando un knob. Puede ser continuo o discreto (con pasos, vía npos). La orientación se detecta automáticamente: horizontal si ancho ≥ alto, si no vertical. Tocar fuera del knob anima suavemente hasta el punto tocado; arrastrar actualiza el valor continuamente.
🟢 · Paquete:
dev.crossfly.ui· Extiende:Component· Estilo:SliderStyle(con variante presionadasliderPressed())
Cuándo usar
- Valores continuos o aproximados: volumen, brillo, rangos, zoom.
- Selección en pocos pasos discretos (ej.: 1 a 5) con
npos.
Cuándo NO usar
- Cuando el usuario necesita escribir un número exacto → usa
textfielden modo numérico.
Apariencia
Una barra en dos segmentos — relleno (antes del knob) y vacío (después) — más el knob. Las coordenadas de cada segmento (bx1/by1/bw1/bh1, bx2/by2/bw2/bh2) y del knob (kx/ky/ks) se calculan en layout (todas float). El grosor de la barra es thickness * fontHeight; el knob es knobSize * fontHeight (del SliderStyle).
Ejemplo completo (copiar, pegar y ejecutar)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
/** Pantalla principal ejecutable. Apunta el launcher (classname) y corre: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
Label saida = new Label("Volume: 50");
add(LAY_AUTO, saida);
// Slider continuo 0..100 iniciando en 50; onAction se dispara en cada cambio de value
Slider volume = new Slider(0, 100, 50);
volume.onAction(c -> saida.setText("Volume: " + (int) volume.value));
add(LAY_AUTO, volume);
}
}
Los fragmentos de abajo muestran solo el núcleo (lo que va dentro de
onShow()). Para ejecutarlos, colócalos en el esqueletoMainWindowde arriba.
Uso básico
Slider volume = new Slider(0, 100, 50); // continuo, inicia en 50
volume.onAction(c -> System.out.println("valor: " + volume.value));
container.add(LAY_AUTO, volume);
Constructores
| Constructor | Descripción |
|---|---|
Slider(float min, float max, float value) |
Slider continuo. |
Slider(float min, float max, float value, int npos) |
Slider discreto: npos posiciones (ej.: 5 → pasos en 0%, 25%, 50%, 75%, 100%). |
Propiedades y personalización
| Propiedad / método | Tipo | Por defecto | Qué hace |
|---|---|---|---|
value |
float (campo) |
ctor | Valor actual (lectura). |
min / max |
float (campo) |
ctor | Límites del intervalo. |
npos |
int (campo) |
0 |
Nº de posiciones discretas; 0 = continuo. |
setValue(float) |
void |
— | Define el valor inmediatamente (= setValue(v, false)); aplica clamp + snap. |
setValue(float, boolean animated) |
void |
— | Define el valor con/sin animación; dispara runActions(). |
Callbacks y eventos
| Callback | Cuándo se dispara |
|---|---|
onAction(Action) |
En cada cambio de value (arrastre, animación de tap y setValue). |
Estados
- dragging: mientras el usuario arrastra el knob (
onPan),valuese actualiza en cada movimiento. - tap-to-jump: tocar fuera del knob anima hasta el punto tocado (
PositionAnimation, duraciónstyle.animationDuration). - pressed: usa el estilo presionado propio (
sliderPressed()).
Slider discreto con 5 paradas
Slider nivel = new Slider(0, 100, 50, 5); // pasos: 0,25,50,75,100
nivel.onAction(c -> System.out.println("nível: " + nivel.value));
container.add(LAY_AUTO, nivel);
nivel.setValue(75, true); // anima hasta 75 (será snapped al paso más cercano)
Buenas prácticas
- Pasa un
valueinicial dentro de[min, max]: el constructor no hace clamp (solosetValuelo hace). - Para forzar orientación vertical, dale al slider más alto que ancho en el layout.
Errores comunes
- Asumir orientación fija: se decide en el layout por la razón ancho/alto.
- Esperar valores continuos con
npos > 0: en modo discreto el valor siempre está “snapped” al paso.