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));
我确认你的建议很容易解决问题,谢谢:)