在 CodenameOne 中,为什么复选框未选中但显示为已选中?

In CodenameOne, why is a checkbox not selected but appearing selected?

我有一个奇怪的问题 - 不确定是否存在编码错误或 CN1 中的错误。

基本上我创建了一行 CheckBox 对象并将它们放在一个 X-Scrollable 的容器中。如果我单击一个未选中的项目并拖动直到 "elastic" 效果将其拉回,它似乎已被选中,但代码不会将其记录为已选中。

问题请看以下视频: https://youtu.be/EtputE1kjyo

请注意,在控制台输出中,单词 'selected' 在字段被选中时大写,未选中时小写。焦点相同(我将焦点添加到输出以确定 setFocusable() 是否按预期工作,以便焦点不应该为选择错误负责)。

这是复选框创建代码:

cb = new CheckBox(getCacheableImageMaxHeight(mod.getIconFile(),moduleImageHeight));
cb.setName(mod.getModuleID());
cb.setToggle(true);
cb.setUIID("ModuleButton");
cb.setFocusable(false);
cb.setScrollVisible(false);
cb.setTextPosition(Component.BOTTOM);
cb.setCloudDestinationProperty(cb.getName());

//actionlistener added for debugging only
final CheckBox cbFinal = cb;
final String modName = mod.getDisplayName();
cb.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        System.out.println(modName+", "+(cbFinal.isSelected()?"SELECTED":"selected") + ", " + (cbFinal.hasFocus()?"FOCUS":"focus"));
    }
});
c.addComponent(cb);

更新:我发现这里 war 有两个 "states": toggleButtons(我现在意识到它们不仅仅是 CheckBoxes,因为我设置了 "setToggle(true)) are getting stuck in the "pressed" 状态,因为它们被拖动并释放 "elastic" 效果。不幸的是, "pressed" 和 "selected" 状态具有相同的外观,这意味着我的用户认为他们在拖动操作期间只是卡在 "pressed" 时选择了某些东西。

这是我进行的更多调试。

因此问题更改为:是否已经存在针对这种情况的未解决的错误(释放按钮后按下状态卡住),如果是,是否有修复或解决方法?

只需将选定状态设置为与按下状态不同的样式,它应该可以正常工作。

在触摸设备中,手指抬起时不会呈现选定状态。这几乎总是正确的,除非你在 Display 中更改了一个标志或设置了一些神秘的主题常量。

所以我想出了一个更有效的解决方法,它不涉及添加单独的按下样式(因为可能有按钮被选中、被按下,以及被选中+被按下时出现错误)

我需要捕获滚动停止的事件,然后检查按钮的状态以确保 none 仍处于按下状态。为此,我在滚动容器上使用 addPointerReleasedListener 来检测指针何时离开(因此它的组件肯定不再被按下),然后在它的 Runnable 中,我确保每个组件都被释放.

scrollingContainer.addPointerReleasedListener(evt -> {
    Container cont = (Container) evt.getComponent();
    Iterator<Component> buttons = cont.iterator();
    while (buttons.hasNext()){
        Button button = (Button) buttons.next();
        if (button.getState() == Button.STATE_PRESSED) {
            button.released();
        }
    }
});

至此问题似乎解决了。现在我们只需要一个永久修复,或者 ToggleButtons 文档中的注释,当它们在滚动容器中时,它们可能会卡在按下状态并需要释放。