Esta página fue traducida automáticamente del portugués y puede contener errores. La versión en portugués es la canónica.
Cómo mostrar un popup de selección modal
Propósito. Abrir una lista de selección como ventana flotante (no incrustada en el layout).
ListViewWindow envuelve un ListView dentro de un Window, lo centra en la pantalla y se cierra
solo cuando el usuario selecciona. Sirve tanto para selección simple como para filas con
apariencia personalizada.
APIs usadas
new ListViewWindow(String[] items, ListViewWindow.ItemType type)— crea el popup; también existe la sobrecarga conString title.ListViewWindow.ItemType.SINGLE/MULTIPLE— enum propio deListViewWindow(alias deListView.ItemType, convertido internamente portoPanel()).ListViewWindow.size(float widthRatio, float heightRatio)— tamaño como fracción de la pantalla (defaults0.5f,0.5f); el popup siempre está centrado.ListViewWindow.onConfirm(Component.Action)— delega alListViewinterno; al confirmar en SINGLE, la ventana se cierra mediantecloseAction(this::hide).ListViewWindow.ItemFactory(ItemFactory factory)— atención: método con inicial mayúscula. La interfaz esItemFactory { Component create(String text, int index) throws Exception; }.ListViewWindow.show()/hide()— heredados deWindow(apila/desapila en elEventsProcessor).ListViewWindow.getSelectedText()/getSelectedIndex()/getSelectedTexts()— delegados al panel interno.ListViewWindow.getPanel()— acceso alListViewsubyacente, por si necesitas configuración avanzada.
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());
final String[] paises = {"Brasil", "Portugal", "Angola", "Moçambique"};
// ListViewWindow es popup: NO entra en el layout — abre con show() disparado por un Button
Button abrir = new Button("Escolher país");
abrir.onClick(e ->
{
ListViewWindow popup = new ListViewWindow("País", paises, ListViewWindow.ItemType.SINGLE);
popup.size(.6f, .5f); // 60% del ancho, 50% de la altura de la pantalla
popup.onConfirm(ev ->
{
String pais = popup.getSelectedText(); // la ventana ya se cierra sola en SINGLE
Debug.log("País: " + pais);
return null;
});
popup.show(); // abre modal centrado
return null;
});
add(LAY_AUTO, abrir);
}
}
El fragmento de abajo muestra solo el núcleo. Para ejecutarlo, colócalo en el esqueleto
MainWindowde arriba.
Fragmento mínimo
// verificado en la fuente: ListViewWindow.java
String[] paises = {"Brasil", "Portugal", "Angola", "Moçambique"};
ListViewWindow popup = new ListViewWindow("País", paises, ListViewWindow.ItemType.SINGLE);
popup.size(.6f, .5f); // 60% del ancho, 50% de la altura de la pantalla
popup.onConfirm(e ->
{
String pais = popup.getSelectedText(); // la ventana ya se cierra sola en SINGLE
return null;
});
popup.show(); // abre modal centrado
Filas personalizadas con ItemFactory (nota la I mayúscula en el nombre del método):
// verificado en la fuente: ListViewWindow.ItemFactory (interface) + método ItemFactory(...)
ListViewWindow popup = new ListViewWindow("Contato", nomes, ListViewWindow.ItemType.SINGLE);
popup.ItemFactory((text, index) ->
{
Component linha = new Component();
linha.setLayout(new GridLayout());
linha.add(new Label(text)); // monta la fila como quieras
return linha;
});
popup.onConfirm(e -> { /* ... */ return null; });
popup.show();
Divergencia Javadoc × código: el Javadoc de clase muestra
sel.show()sobre unListView, peroshow()/hide()existen enWindow— por lo tanto en elListViewWindow, no en elListView. Para el modo popup usa siempreListViewWindow.
Profundiza
- Versión incrustada (sin ventana) de la misma lista: lista-simples.md.
- Guía del widget: ListViewWindow · Fuente canónica: Capítulo 15