[英]In CodenameOne, why is a checkbox not selected but appearing selected?
我有一个奇怪的问题 - 不确定是否存在编码错误或CN1中的错误。
基本上我创建了一行CheckBox对象并将它们放在一个X-Scrollable的容器中。 如果我单击一个未选择的项目并拖动,直到“弹性”效果将其拉回,它似乎被选中,但代码不会将其记录为选中。
请参阅以下问题视频: https : //youtu.be/EtputE1kjyo
请注意,在控制台输出中,单词“selected”在选择字段时大写,在取消选择时小写。 焦点相同(我将焦点添加到输出以确定setFocusable()是否按预期工作,因此焦点不应归咎于选择错误)。
这是Checkbox创建代码:
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);
更新:我已经意识到这里有两个“状态”: toggleButtons(我现在意识到它们不仅仅是CheckBoxes,因为我设置了“setToggle(true)”因为它们被拖动而被卡在“按下”状态不幸的是,“按下”和“选中”状态具有相同的外观,这意味着我的用户认为他们在拖动操作期间被“按下”时已经选择了某些东西。
所以问题变成: 这种情况是否已经存在一个漏洞(压缩状态在按钮释放后停滞不前)如果是这样,现在是否有修复或解决方法?
只需将所选状态设置为与按下状态不同,它应该可以正常工作。
在触摸设备中,当手指向上时不会呈现所选择的状态。 除非你在Display
更改了一个标志或设置了一些奥术主题常量,否则这几乎总是正确的。
所以我想出了一个更有效的解决方法,不涉及添加单独的按下样式(因为可能有按钮选择,按下,选择+按下该错误)
我需要捕获滚动停止的事件,然后检查按钮的状态以确保没有按下任何按钮。 为此,我在滚动容器上使用了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
文档中的注释,当它们在滚动容器中时,它们可能会陷入压缩状态并需要被释放。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.