Codenameone 代码名One-tabs.addSelectionListener+;tabs.removeTabAt=java.lang.StackOverflower错误

Codenameone 代码名One-tabs.addSelectionListener+;tabs.removeTabAt=java.lang.StackOverflower错误,codenameone,Codenameone,当用户点击一些按钮时,我的应用程序会添加新的标签。我希望每次用户从最后一个选项卡滑动到倒数第二个选项卡时,最后一个选项卡应该自动删除 我的守则草案: tabs.addSelectionListener((oldSelected, newSelected) -> { Log.p("There are " + tabs.getTabCount() + " tabs in total"); Log.p("Index of oldSelected tab: " + oldSelec

当用户点击一些按钮时,我的应用程序会添加新的标签。我希望每次用户从最后一个选项卡滑动到倒数第二个选项卡时,最后一个选项卡应该自动删除

我的守则草案:

tabs.addSelectionListener((oldSelected, newSelected) -> {
    Log.p("There are " + tabs.getTabCount() + " tabs in total");
    Log.p("Index of oldSelected tab: " + oldSelected);
    Log.p("Index of newSelected tab: " + newSelected);
    if (newSelected == oldSelected - 1) {
        Log.p("The user selected the previous tab");
        tabs.removeTabAt(oldSelected);
        Log.p("I removed the oldSelected tab");
    }
});
它会生成一个
stackoverflowerrror
,我想这是因为
removeTabAt
会导致无限递归,对已经选择的选项卡进行不必要且未请求的选择(导致调用
SelectionListener

日志:

[EDT] 0:0:10,747 - There are 2 tabs in total
[EDT] 0:0:10,747 - Index of oldSelected tab: 1
[EDT] 0:0:10,747 - Index of newSelected tab: 0
[EDT] 0:0:10,747 - The user selected the previous tab
[EDT] 0:0:10,747 - There are 2 tabs in total[EDT] 0:0:10,747 - Exception: java.lang.StackOverflowError - null

有什么解决方案吗?

您正在修改一个组件,因为该组件中的事件通常是有问题的,因为事件触发代码可能依赖于该组件的结构

您可以使用
callSerially
将UI的变化推迟到下一个EDT周期:

callSerially(() -> tabs.removeTabAt(oldSelected));

我确认你的建议很容易解决问题,谢谢:)