本页面由葡萄牙语机器翻译,可能存在错误。葡萄牙语版本为准。
如何显示模态选择弹窗
目的。 将选择列表作为浮动窗口打开(而非嵌入到布局中)。
ListViewWindow 将 ListView 包裹在 Window 中,将其在屏幕上居中,并在用户选择时
自动关闭。既适用于简单选择,也适用于外观自定义的行。
使用的 API
new ListViewWindow(String[] items, ListViewWindow.ItemType type)— 创建弹窗;还有一个带String title的重载。ListViewWindow.ItemType.SINGLE/MULTIPLE—ListViewWindow的专属枚举(ListView.ItemType的别名,内部由toPanel()转换)。ListViewWindow.size(float widthRatio, float heightRatio)— 尺寸为屏幕的比例(默认0.5f、0.5f);弹窗始终居中。ListViewWindow.onConfirm(Component.Action)— 委托给内部的ListView;在 SINGLE 模式下确认时,窗口通过closeAction(this::hide)自动关闭。ListViewWindow.ItemFactory(ItemFactory factory)— 注意:方法名首字母大写。接口为ItemFactory { Component create(String text, int index) throws Exception; }。ListViewWindow.show()/hide()— 继承自Window(在EventsProcessor中入栈/出栈)。ListViewWindow.getSelectedText()/getSelectedIndex()/getSelectedTexts()— 委托给内部面板。ListViewWindow.getPanel()— 访问底层的ListView,如需高级配置。
完整示例(复制、粘贴并运行)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
/** 可执行的主界面。将 launcher 指向此类(classname)并运行: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 是弹窗:不进入布局 — 由 Button 触发 show() 打开
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%,高度的 50%
popup.onConfirm(ev ->
{
String pais = popup.getSelectedText(); // SINGLE 模式下窗口会自动关闭
Debug.log("País: " + pais);
return null;
});
popup.show(); // 打开居中的模态框
return null;
});
add(LAY_AUTO, abrir);
}
}
下面的片段只展示核心部分。要运行它,请将其放入上面的
MainWindow骨架中。
最小片段
// 已在源码核实:ListViewWindow.java
String[] paises = {"Brasil", "Portugal", "Angola", "Moçambique"};
ListViewWindow popup = new ListViewWindow("País", paises, ListViewWindow.ItemType.SINGLE);
popup.size(.6f, .5f); // 屏幕宽度的 60%,高度的 50%
popup.onConfirm(e ->
{
String pais = popup.getSelectedText(); // SINGLE 模式下窗口会自动关闭
return null;
});
popup.show(); // 打开居中的模态框
使用 ItemFactory 的自定义行(注意方法名中的 I 大写):
// 已在源码核实:ListViewWindow.ItemFactory(接口)+ 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)); // 按你所需构建该行
return linha;
});
popup.onConfirm(e -> { /* ... */ return null; });
popup.show();
Javadoc 与代码的差异:类的 Javadoc 展示了在
ListView上调用sel.show(),但show()/hide()存在于Window中——因此在ListViewWindow上,而不是在ListView上。 弹窗模式请始终使用ListViewWindow。
深入了解
- 同一列表的嵌入版本(无窗口):lista-simples.md。
- 组件指南:ListViewWindow · 权威来源:第 15 章
这个页面有帮助吗?感谢你的反馈!