【问题标题】:Overflowing layout with TableLayout使用 TableLayout 溢出布局
【发布时间】:2019-04-03 11:42:42
【问题描述】:

我需要在一个表格中连续显示三件事。第一列应该有一个固定的宽度,比如屏幕的 15%。第三个应该右对齐并采用其首选宽度。第二个应该占据所有剩余空间(我需要添加一些间距,但这是另一回事)。

这发生在start:

    final Container list = new Container(BoxLayout.y());
    list.setScrollableY(true);
    final String[][] lines = {
            {"19", "Some text", "123,00"},
            {"20", "Some very very very very looong text", "1,00"},
    };
    for(final String[] line : lines) list.add(createContainer(line));
    form.add(list);

容器相当琐碎:

private Container createContainer(String[] line) {
    final TableLayout tableLayout = new TableLayout(1, 3);
    tableLayout.setGrowHorizontally(true);
    final Container result = new Container(tableLayout);
    {
        final Label l = new Label(line[0]);
        l.getAllStyles().setFgColor(0x0000FF);
        result.add(tableLayout.createConstraint().widthPercentage(15), l);
    }
    {
        final Label l = new Label(emptyToSpace(line[1]));
        l.getAllStyles().setFont(Font.createSystemFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM));
        result.add(tableLayout.createConstraint().widthPercentage(-2), l);
    }
    {
        final Label l = new Label(line[2]);
        l.getAllStyles().setFont(Font.createSystemFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE));
        l.getAllStyles().setFgColor(0x00FF00);
        result.add(tableLayout.createConstraint().widthPercentage(-1).horizontalAlign(Component.RIGHT), l);
    }
    return result;
}

根据 javadoc,-1 表示首选大小,-2 表示“剩余空间”。这有点工作,但似乎有一个误判。

无论我选择什么设备,模拟器都会出现问题。我可能做错了,因为我是代号布局的新手。

【问题讨论】:

    标签: java codenameone layout-manager tablelayout


    【解决方案1】:

    -2 标志主要针对最后一列进行了优化,因此这看起来像一个错误,但可能很难解决。我认为这里不需要使用表格布局,因为您不使用可以提供行之间对齐的表格。

    更简单的方法是边框布局,例如:

    Container c = BorderLayout.centerEastWest(new Label(emptyToSpace(line[1])), 
                       rightText, leftText);
    

    如果您希望左列对齐,只需在整个列上使用 Component.setSameWidth()

    【讨论】:

    • 这行得通,但在所有“西部”上的Component.setSameWidth() 是相当不切实际的,因为我必须为通话收集它们。更糟糕的是,在点击时,我将一行替换为扩展版本(SpanLabel 中的中间文字以及其他部分的一些细微视觉变化),所以我不得不重新收集它们。为了防止内存泄漏,我是否必须致电Component.setSameWidth(theNoMoreUsedWestComponent)
    • 如果您经常重复使用组件,那么是的,您应该调用它,但对于实际使用,我怀疑会有泄漏,因为整个表单都将被 GC 处理。另一种方法是使用一个表格布局,其中包含两列和与项目一样多的行。添加第一列作为对齐的数字。然后像以前一样使用仅中心和右侧的边框布局。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2011-10-26
    相关资源
    最近更新 更多