You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Codename One的Container中实现搜索过滤器?

嘿,我来帮你搞定Codename One里Container按钮的搜索过滤功能!先给你梳理下核心思路:我们需要加一个搜索输入框,监听用户的输入变化,然后动态筛选出匹配关键词的按钮,显示出来,隐藏不匹配的。

完整实现代码

我把你的现有代码补全并加上过滤功能,你可以直接参考:

public void listMenu() {
    Dialog loading = new InfiniteProgress().showInfiniteBlocking();
    loading.show();
    
    final Form listMenu = new Form("List Menu");
    listMenu.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
    
    // 1. 添加搜索输入框
    TextField searchField = new TextField("", "Search menus...");
    listMenu.add(searchField);
    
    Container list = new Container(new BoxLayout(BoxLayout.Y_AXIS));
    listMenu.add(list);
    
    Button back = new Button("Back to Main Menu");
    back.addActionListener(e -> {
        // 这里添加返回主菜单的逻辑
        listMenu.back();
    });
    listMenu.add(back);
    
    // 存储所有菜单按钮的列表,方便后续过滤
    ArrayList<Button> menuButtons = new ArrayList<>();
    
    // 2. 从Parse获取数据并生成按钮(补全你的ParseQuery逻辑)
    ParseQuery<ParseObject> query = ParseQuery.getQuery("YourMenuClassName");
    try {
        List<ParseObject> menuItems = query.find();
        for (ParseObject item : menuItems) {
            String menuName = item.getString("menuName"); // 假设你的Parse字段是menuName
            Button menuBtn = new Button(menuName);
            menuBtn.addActionListener(e -> {
                // 添加按钮点击逻辑
                Dialog.show("Selected", "You chose: " + menuName, "OK", null);
            });
            list.add(menuBtn);
            menuButtons.add(menuBtn);
        }
    } catch (ParseException ex) {
        Dialog.show("Error", "Failed to load menus: " + ex.getMessage(), "OK", null);
    } finally {
        loading.dispose();
        listMenu.show();
    }
    
    // 3. 实现搜索过滤逻辑
    searchField.addDataChangedListener((type, index) -> {
        String searchText = searchField.getText().trim();
        for (Button btn : menuButtons) {
            boolean isMatch = StringUtil.containsIgnoreCase(btn.getText(), searchText);
            btn.setVisible(isMatch);
        }
        // 刷新Container的布局,让UI更新
        list.revalidate();
    });
}
关键部分解释
  • 搜索输入框:用TextField实现,提示用户输入搜索关键词
  • 菜单按钮列表:把所有生成的按钮存在menuButtons里,避免每次过滤都重新遍历Container的子组件,效率更高
  • 过滤逻辑:监听搜索框的内容变化,用StringUtil.containsIgnoreCase做不区分大小写的模糊匹配,设置按钮的可见性,最后调用revalidate()刷新Container的布局,确保UI及时更新
  • 加载对话框:在finally块里关闭加载框,避免请求失败后加载框一直显示

如果你的按钮是手动添加而不是从Parse获取的,只需要把生成按钮的部分换成你自己的代码,然后把按钮加入menuButtons列表就可以啦!

内容的提问来源于stack exchange,提问作者Simple

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:36:14