Codenameone 在代号为One的边界布局的南部容器中居中放置标签

Codenameone 在代号为One的边界布局的南部容器中居中放置标签,codenameone,Codenameone,在我的Codename One应用程序中,当应用程序发送查询时,我想在中间显示一个InfiniteProgress,在它下面显示一个居中的标签,告诉用户发生了什么。因此,我创建了一个带有BorderLayout的容器,并添加了带有constraintBorderLayout.CENTER的无限进度,以及一个带有BorderLayout.SOUTHconstraint的容器,其中包含标签。内部容器布局为BorderLayout,带有BorderLayout.CENTER\u BEHAVIOR\u

在我的Codename One应用程序中,当应用程序发送查询时,我想在中间显示一个
InfiniteProgress
,在它下面显示一个居中的标签,告诉用户发生了什么。因此,我创建了一个带有
BorderLayout
的容器,并添加了带有constraint
BorderLayout.CENTER
的无限进度,以及一个带有
BorderLayout.SOUTH
constraint的容器,其中包含标签。内部容器布局为
BorderLayout
,带有
BorderLayout.CENTER\u BEHAVIOR\u CENTER\u ABSOLUTE
。然后,我只需添加带有约束的标签
BorderLayout.CENTER
,这将使标签居中。但是,当我尝试将标签的文本更改为更长的文本时,它会被剪切。可使用以下简单示例演示此问题:

    Form hi = new Form("Welcome", new BorderLayout(BorderLayout.CENTER_BEHAVIOR_CENTER_ABSOLUTE));
    Button button = new Button("Change text");
    Label label = new Label("South");
    button.addActionListener(event -> {
        label.setText("A lot longer text");
    });
    hi.add(BorderLayout.CENTER, button);

    Container container = new Container();
    container.setLayout(new BorderLayout(BorderLayout.CENTER_BEHAVIOR_CENTER_ABSOLUTE));
    container.add(BorderLayout.CENTER, label);
    hi.add(BorderLayout.SOUTH, container);
    hi.show();
现在,当我单击按钮更改标签的文本时,您可以看到标签没有显示全部文本(参见图片)


设置标签文本后添加此行:

label.getParent().revalidate();

谢谢我原以为Label会像在很多情况下一样自动设置,但我确实应该尝试一下。调用repaint()时,revalidate()要慢得多,因为它需要回流UI,所以它不是隐式的。这也允许类似于
animateLayout()
的操作,如果隐含重新验证日期,则这些操作将不起作用。因此,重新绘制()和重新验证日期()之间的区别在于,重新验证日期()会将所有组件再次放入容器中,因此,例如,在向容器添加组件时,我会调用重新验证日期(),而重新绘制()只会重新绘制组件,当我改变组件的外观时,我会调用它,如本例中所示。我是否正确理解了两者之间的区别?重新绘制,但不重新排列边界。重新验证使UI回流,这意味着它可以改变组件边界。这在《开发人员指南》中进行了讨论,我们在其中介绍了animateLayout()的值,它是一种重新验证的形式,将该动作作为动画执行。。。