Codename One - 有没有办法避免在点击时更改Button的UIID?

时间:2017-07-21 16:38:47

标签: codenameone

以下是面对我的问题的代码示例。

Container master, content;
Button lockButton;
void layout () {
    master = new Container (new LayeredLayout ());
    content = new Container (BoxLayout.y());
    content.setScrollableY (true);
    lockButton = new Button ("");
    lockButton.setUIID ("ButtonInvisible");
    lockButton.addActionListener ((e)->{
        unlock ();
    });
    master.add(content);
}
void lock () {
    master.add(lockButton);
}
void unlock () {
    lockButton.remove ();
}

ButtonInvisible 已选择未选中已按下样式相同。

问题描述:

  1. 向下滚动content
  2. 调用lock()
  3. 点击contentlockButton拦截点击)
  4. 按下指针时content的滚动为0,在发布时它会返回上一个数量。
  5. 我想这是因为Button会在点击时更改它的样式,这会导致重新绘制/重新验证基础内容的错误。

    根据Diamond的回答更新

    其他信息

    容器masterSwipeableContainer的核心部分。

    只要打开lock(),就会调用方法SwipeableContainer

    如果我在revalidate()打开时调用SwipeableContainer - 屏幕奇怪地闪烁,但行为没有改变 - 只要按下按钮,滚动仍然会跳到零。

    可能很重要 - 容器Tabs

    中有content个组件

    在此版本的代码中,重新验证不能成为此类问题的原因,因为没有添加或删除任何组件,但问题仍然相同。

    Container master, content;
    Button lockButton;
    void layout () {
        master = new Container (new LayeredLayout ());
        content = new Container (BoxLayout.y());
        content.setScrollableY (true);
        lockButton = new Button ("");
        lockButton.setUIID ("ButtonInvisible");
        lockButton.addActionListener ((e)->{
            unlock ();
        });
        lockButton.setFocusable(false);
        master.add(content).add(lockButton);
    }
    void lock () {
        lockButton.setFocusable(true);
    }
    void unlock () {
        swipeableContainer.close ();
        lockButton.setFocusable(false);
    }
    

2 个答案:

答案 0 :(得分:2)

问题在于,当您调用lock()时未发生重新验证,因此lockButton未正确布局,只有在您点击{{1}的任何部分时才能正确定位容器(滚动不适用)。

解决方案是在主要UI更改之后始终调用master / repaint()或某种动画,例如在容器中添加和删除组件。

revalidate()

答案 1 :(得分:0)

这仅在模拟器中发生。在真实的设备上一切都很好。遗憾。