Pular para o conteúdo
CrossFly é 100% open sourceSiga no GitHub
CrossFlyCrossFly
Começar

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 com String title.
  • ListViewWindow.ItemType.SINGLE / MULTIPLE — enum próprio de ListViewWindow (alias de ListView.ItemType, convertido internamente por toPanel()).
  • ListViewWindow.size(float widthRatio, float heightRatio) — tamanho como fração da tela (defaults 0.5f, 0.5f); o popup é sempre centralizado.
  • ListViewWindow.onConfirm(Component.Action) — delega ao ListView interno; ao confirmar em SINGLE, a janela se fecha via closeAction(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 de Window (empilha/desempilha no EventsProcessor).
  • ListViewWindow.getSelectedText() / getSelectedIndex() / getSelectedTexts() — delegados ao painel interno.
  • ListViewWindow.getPanel() — acesso ao ListView subjacente, 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 MainWindow acima.

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 um ListView, mas show()/hide() existem em Window — portanto no ListViewWindow, não no ListView. Para o modo popup use sempre ListViewWindow.

Aprofunde-se

Esta página foi útil?