【问题标题】:How to delete all components in a form on Codenameone?如何删除 Codenameone 上表单中的所有组件?
【发布时间】:2021-08-26 19:29:23
【问题描述】:

我正在用 Codenameone 编写一个程序,该程序将从 url 中提取一系列产品并将它们显示在列表中。我想在每次按下按钮时重新加载页面,因此我编写了一个名为 reload 的方法,该方法应该删除表单中的所有内容,然后将其全部替换为新拉出的列表。

public void reload(Form list){
    list.removeAll();
    list.repaint();
    list.add(lpanelf);


    pull();


    for(int i=0; i<(products.size());i++){
        System.out.println(products.get(i));
    }
    for(int i = 0; i<(products.size()/2);i++){
        list.add(createWidget(products.get(i*2),products.get(i*2+1),i));
    }



    list.addComponent(lpanelb);

}

而createWidget是:

public SwipeableContainer createWidget(String product, String amount,int i) {

    MultiButton button = new MultiButton(product);
    Button buttonb = new Button("DELETE");
    deleteb.add(button);
    slide.add(buttonb);
    button.setLayout(new GridLayout(1,2));
    button.add(amount);
    return new SwipeableContainer(slide.get(i),deleteb.get(i));

}

第一次重新加载后,它会抛出:

java.lang.IllegalArgumentException: 组件已包含在 容器:Container[x=0 y=0 width=1125 height=165 name=null, layout = BorderLayout,scrollableX = false,scrollableY = false,组件 = [按钮]]。

我认为问题在于 removeAll 实际上并没有删除所有可滑动的容器,因此它不会让我在它们的位置创建新容器,但我不太确定。任何帮助将不胜感激。

【问题讨论】:

    标签: java codenameone


    【解决方案1】:

    removeAll() 不递归。由于 GC 通常会删除整个树,因此这会很昂贵并且通常是多余的。

    通常,这些问题很容易解决。有两种方法:

    • 停止缓存组件并在每次重新加载时重新创建它。这将意味着它永远不会“已经在”某事

    • 在添加有问题的组件之前,只需执行:problematicComponent.remove()。这会将其从其父级中删除(如果没有父级,则不执行任何操作)

    在您的情况下,您似乎正在这样做:

    return new SwipeableContainer(slide.get(i),deleteb.get(i));
    

    做完之后链接这个:

    slide.add(buttonb);
    

    所以您将buttonb 添加到slide。这意味着buttonb.getParent() == slide。然后创建一个新的SwipableContainer 并尝试向其中添加一个已经存在的组件。

    我在这里猜测,因为您没有说明哪一行引发了异常,但在那一行您会发现有问题的组件。

    这行也有问题:button.add(amount);

    您依赖于 MultiButton 继承自 Container 的事实,但这是脆弱的行为。您应该使用其中一种设置文本行方法。

    【讨论】:

    • 调用createWidget时报错。执行 .remove() 的问题是我正在使用 createWidget 创建组件,它每次都会返回一个新的 SwipableContainer。我不知道如何在创建这些组件后调用它们。我尝试将它们全部添加到列表中,通过索引它们将它们添加到我的表单中,然后通过索引它们来删除它们,但这也不起作用。
    • 没关系,看起来我通过清除我的删除和幻灯片列表让它工作了。感谢您的帮助!
    猜你喜欢
    • 2010-10-07
    • 2022-08-14
    • 1970-01-01
    • 2016-11-15
    • 2012-03-09
    • 2011-07-21
    • 2013-05-28
    • 2011-01-12
    • 1970-01-01
    相关资源
    最近更新 更多