2017-03-07 71 views
1

我有一个奇怪的问题 - 不确定是否存在编码错误或CN1中的错误。在CodenameOne中,为什么复选框未选中,但出现选中?

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

请参阅问题的以下视频: https://youtu.be/EtputE1kjyo

注意,在控制台输出,“选择”这个词时,已经选择了场,当它处于未选中资本小写。焦点相同(我将焦点添加到输出以确定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); 

更新:我已经意识到有两个“国家”的战争在这里: 的的ToggleButtons(我现在认识到他们不是仅仅的CheckBox,因为我set“setToggle(true))会被拖拽到”按下“状态,因为它们是通过”弹性“效果拖动和释放的。不幸的是,”按下“和”选定“状态具有相同的外观,这意味着我的用户认为他们已经选择了一些东西,只是在拖动操作过程中被卡住“按下”。

这是我做的更多调试。
Pressed AND Selected!

  • 第一按钮被按下,但没有选择(错误)。
  • 第二个按钮是正常选择,并没有显示错误。
  • 第三个按钮很有趣,因为我选择了它,然后拖动并释放它以使其被选择并按下!

所以问题变为:是否有一个开放的错误造成这种局面已经(按下状态得到释放按钮后卡住),如果是这样,有来修复或现在的解决方法?

+0

我认为这是因为'CheckBox'被设置为一个'ToggleButton',你的点击拖动滚动保持有点太长。 – Diamond

回答

0

所以我想通了,不涉及添加单独的压制风格更有效的解决方法(因为选择的按钮有可能是,压制,并选择与+错误按下)

我需要捕获事件停止滚动,然后检查按钮的状态以确保没有任何按钮被按下。为此,我在滚动容器上使用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的文档中注意到,当它们在滚动容器中时,它们可能卡在按下状态并需要释放。

0

只是样式选择状态看起来不同于按下状态,它应该工作正常。

在触摸设备中,当手指向上时,未呈现选定状态。这几乎总是如此,除非你改变了Display的旗帜或设置了一些神秘的主题不变。

+0

我想这是一个解决方法,虽然我可能不得不将样式“按下”看起来像“未选中”,以免它引起混淆(某些元素看起来会被选中,而其他元素看起来会让他们感到困惑......)。那么这意味着没有视觉反馈给用户什么时候按下..我发现我自己的解决方法,我会发布,但我希望这实际上被认为是一个错误,将得到解决......我应该添加该项目的错误? –

+0

不,这是相反的。按下应该有一个按下的外观,选择更容易解释。我不确定在这里看到一个错误。 –

+0

在我看来,这个错误是在拿起我的手指后,按钮仍处于按下状态。如果这不是一个错误,你能帮我理解我什么时候使用这种行为?也许我试图错误地使用切换按钮? –

相关问题