【问题标题】:Container preferred size Codename One容器首选尺寸代号一
【发布时间】:2017-12-04 12:54:29
【问题描述】:

我似乎对容器如何计算它们与容器中的组件相比的高度感到困惑。

我有一个带有 1 行 2 列的 TableLayout 的容器。在两个单元格中都有不同的 TextAreas。

TableLayout tl = new TableLayout(1, 2);
Container container = new Container(tl);
TextArea ta1 = new TextArea("Some long text");
TextArea ta2 = new TextArea("Some other long text");
container.add(tl.createConstraint().widthPercentage(50), ta1);
container.add(tl.createConstraint().widthPercentage(50), ta2);

我遇到的问题是容器的高度大约是两个 TextAreas 高度的两倍,这在 TextAreas 下留下了一个大的、不需要的间隙。

我尝试覆盖似乎适用于我输入的任何 Dimension 的 calcPreferredSize 方法。问题是我不知道两个 TextArea 的高度是多少。

我做错了什么?

谢谢。

【问题讨论】:

    标签: java codenameone


    【解决方案1】:

    这是一个固有的回流问题。文本区域不“知道”它将被分配多少空间,因此它从父布局请求特定的首选大小。

    父布局使用它自己的逻辑,它与首选尺寸有一定关系,但也与您的请求有一定关系(例如 50% 宽度,2 列)。它为文本区域提供了它“认为”可以工作的空间。如果不是,则文本区域会尝试调整一次大小,但这可能会导致我们的工作不准确。

    一些框架,例如HTML 支持回流的概念,它不断地布置一切。这通常是 HTML 比大多数原生 UI 慢的原因。回流看起来很整洁,但通常很难检测到它何时被征税以“破坏你的 CPU”。

    避免这种情况的常用技巧是确定文本区域的行/列并禁用文本区域的随内容增长选项。这使得组件的大小更具确定性,并且还略微提高了性能。但是,它可能会导致不希望的效果,例如文本被裁剪。

    【讨论】:

    • 虽然文本区域的大小正确,但似乎是容器尺寸过大。当容器知道其子组件的大小时,它无法调整大小是回流问题的一部分吗?
    • 如果您查看 Container 首选尺寸的代码,您会看到它委托给了委托给组件的布局。是的,这是因为回流,所以使文本区域确定性将解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 2014-08-27
    • 2015-07-22
    • 1970-01-01
    • 2016-08-21
    • 2023-03-09
    • 2019-07-23
    相关资源
    最近更新 更多