【问题标题】:Center a label in the south container of a border layout in Codename One在 Codename One 中的边框布局的南容器中居中标签
【发布时间】:2016-10-26 01:19:20
【问题描述】:

在我的 Codename One 应用程序中,当应用程序发送查询时,我想在中心显示一个 InfiniteProgress,并在其下方显示一个居中的标签,告诉用户发生了什么。所以我创建了一个带有BorderLayout 的容器,并添加了带有约束BorderLayout.CENTER 的无限进度和一个带有BorderLayout.SOUTH 约束的容器,其中包含标签。内部容器布局为BorderLayoutBorderLayout.CENTER_BEHAVIOR_CENTER_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();

现在,当我点击按钮更改标签的文本时,您可以看到标签并没有显示整个文本(见图)。

【问题讨论】:

    标签: codenameone


    【解决方案1】:

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

    label.getParent().revalidate();
    

    【讨论】:

    • 谢谢!我认为 Label 会像在很多情况下一样自动设置它,但我确实应该尝试过这个。
    • repaint() 被调用,revalidate() 慢得多,因为它需要重排 UI,所以它不是隐式的。这也允许像 animateLayout() 这样的东西,如果 revalidate 是隐式的,这些东西就不起作用
    • 所以,repaint() 和 revalidate() 的区别在于 revalidates() 将所有组件再次放入容器中,所以例如我在向容器中添加组件时会调用 revalidate(),而 repaint() 只是重绘组件,当我改变组件的外观时我会调用它,就像在这个例子中一样。我是否正确理解了两者之间的区别?
    • repaint 绘制但不重新排列边界。重新验证重排 UI,这意味着它可以移动组件边界。这在开发人员指南中进行了讨论,我们在其中介绍了 animateLayout() 的值,它是一种重新验证的形式,以动画的形式执行该操作...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    相关资源
    最近更新 更多