Como exibir um popup de seleção modal
Propósito. Abrir uma lista de seleção como janela flutuante (não embutida no layout).
ListViewWindow embrulha um ListView dentro de um Window, centraliza-o na tela e o fecha
sozinho quando o usuário seleciona. Serve tanto para seleção simples quanto para linhas com
aparência customizada.
APIs usadas
new ListViewWindow(String[] items, ListViewWindow.ItemType type)— cria o popup; há também a sobrecarga comString title.ListViewWindow.ItemType.SINGLE/MULTIPLE— enum próprio deListViewWindow(alias deListView.ItemType, convertido internamente portoPanel()).ListViewWindow.size(float widthRatio, float heightRatio)— tamanho como fração da tela (defaults0.5f,0.5f); o popup é sempre centralizado.ListViewWindow.onConfirm(Component.Action)— delega aoListViewinterno; ao confirmar em SINGLE, a janela se fecha viacloseAction(this::hide).ListViewWindow.ItemFactory(ItemFactory factory)— atenção: método com inicial maiúscula. A interface éItemFactory { Component create(String text, int index) throws Exception; }.ListViewWindow.show()/hide()— herdados deWindow(empilha/desempilha noEventsProcessor).ListViewWindow.getSelectedText()/getSelectedIndex()/getSelectedTexts()— delegados ao painel interno.ListViewWindow.getPanel()— acesso aoListViewsubjacente, se precisar de config avançada.
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());
final String[] paises = {"Brasil", "Portugal", "Angola", "Moçambique"};
// ListViewWindow é popup: NÃO entra no layout — abre com show() disparado por um 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% da largura, 50% da altura da tela
popup.onConfirm(ev ->
{
String pais = popup.getSelectedText(); // janela já se fecha sozinha em SINGLE
Debug.log("País: " + pais);
return null;
});
popup.show(); // abre modal centralizado
return null;
});
add(LAY_AUTO, abrir);
}
}
O trecho abaixo mostra só o miolo. Para rodar, coloque-o no esqueleto
MainWindowacima.
Trecho mínimo
// verificado na fonte: ListViewWindow.java
String[] paises = {"Brasil", "Portugal", "Angola", "Moçambique"};
ListViewWindow popup = new ListViewWindow("País", paises, ListViewWindow.ItemType.SINGLE);
popup.size(.6f, .5f); // 60% da largura, 50% da altura da tela
popup.onConfirm(e ->
{
String pais = popup.getSelectedText(); // janela já se fecha sozinha em SINGLE
return null;
});
popup.show(); // abre modal centralizado
Linhas customizadas com ItemFactory (note o I maiúsculo no nome do método):
// verificado na fonte: 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)); // monte a linha como quiser
return linha;
});
popup.onConfirm(e -> { /* ... */ return null; });
popup.show();
Divergência Javadoc × código: o Javadoc de classe mostra
sel.show()sobre umListView, masshow()/hide()existem emWindow— portanto noListViewWindow, não noListView. Para o modo popup use sempreListViewWindow.
Aprofunde-se
- Versão embutida (sem janela) da mesma lista: lista-simples.md.
- Guia de widget: ListViewWindow · Fonte canônica: Capítulo 15
Esta página foi útil?Obrigado pelo feedback!