代号 One BoxLayout 滚动

Codename One BoxLayout scroll

我目前正在用代号一写一个简单的游戏,我希望用户选择国家。

我希望在可滚动列表中将国家/地区表示为图像。

我有一个 X 轴上带有 BoxLayout 的容器,里面有带有图标的按钮。

问题是不适合容器的列表项正在被裁剪并且没有在应该绘制的时候绘制。此外,当手指在未绘制的项目上方时,容器不可滚动。

Here is the list

And here how it looks like after scroll

这是来源:

    final Container cont_nations = new Container(new BoxLayout(BoxLayout.X_AXIS));

    int buttons_width = dim_nation_man.getWidth() * 5;
    cont_nations.setPreferredW(buttons_width + 50);
    cont_nations.setPreferredH(dim_nation_man.getHeight());
    cont_nations.setX(Main.screenWidthHalf - buttons_width / 2);
    cont_nations.setY(choiseImage.getY() + dim_choise.getHeight() + Main.cellSize * 0);
    cont_nations.setScrollSize(new Dimension(man_size * imgName_nations.length, man_size));
    cont_nations.setScrollable(true);
    //cont_nations.setScrollVisible(false);

    addComponent(cont_nations);

    for (int i = 0; i < img_nations.length; i++) {
        final Button btn_nation = new Button(img_nations[i][0].image);

        cont_nations.addComponent(btn_nation);
    }

我知道我做错了什么。 也许我不应该使用 Container,或者我应该用另一种方式用 children 填充它,或者用另一个 class 来代替 children。 但是我找不到任何信息出了什么问题。

编辑

我尝试了 Shai Almog 的建议,只使用 setScrollableX(),但没有按我的需要工作。 容器移动到左上角并且不可滚动。

首先,我需要这个滚动条位于特定位置并具有特定大小,所以我为容器的 parent 使用 CoordinateLayout。 这就是我将 setX()、setY() 和 setPreferredW() 与 setPreferredH() 一起使用的原因。

您只想在 X 轴上滚动吗?

删除所有这些代码:

int buttons_width = dim_nation_man.getWidth() * 5;
cont_nations.setPreferredW(buttons_width + 50);
cont_nations.setPreferredH(dim_nation_man.getHeight());
cont_nations.setX(Main.screenWidthHalf - buttons_width / 2);
cont_nations.setY(choiseImage.getY() + dim_choise.getHeight() + Main.cellSize * 0);
cont_nations.setScrollSize(new Dimension(man_size * imgName_nations.length, man_size));
cont_nations.setScrollable(true);

按钮的大小将根据其图标大小调整,因此您无需触摸它。设置位置将不起作用,因为布局管理器将确定它。

只需使用:

cont_nations.setScrollableX(true);

注意最后的X...

为了您的评论的完整性,我添加了一个完整的工作示例来证明这一点:

    Form hi = new Form("Side Scroll");
    hi.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
    int[] colors = { 0xffff0000, 0xff00ff00, 0xff0000ff, 0xff000000 };
    Container side = new Container(new BoxLayout(BoxLayout.X_AXIS));
    side.setScrollableX(true);
    hi.addComponent(side);
    for(int iter = 0 ; iter < 30 ; iter++) {
        side.addComponent(new Button(Image.createImage(100, 50, colors[iter % colors.length])));
    }
    hi.show();

我已经对 BorderLayout 和 CoordinateLayout 的源代码进行了一些调查,但没有发现任何问题。 他们都正确地为 children 调用了 setWidth() 和 setHeight() 方法。

但是,我注意到,如果我将我的 Container 放入 BorderLayout 中,则滚动会根据需要工作,因此我想到用我的 Scrollable Container 创建一个 BorderLayout 容器并将其放置在应有的位置。

我仍然认为 CoordinateLayout 中存在错误,总有一天我会设法找到它。

现在代码看起来像这样并且有效:

final Container borderContainer = new Container(new BorderLayout());
int buttons_width = dim_nation_man.getWidth() * 5;
borderContainer.setX(Main.screenWidthHalf - buttons_width / 2);
borderContainer.setY(choiseImage.getY() + dim_choise.getHeight() + Main.cellSize * 0);
borderContainer.setPreferredW(buttons_width);
borderContainer.setPreferredH(dim_nation_man.getHeight());

addComponent(borderContainer);

final Container cont_nations = new Container(new BoxLayout(BoxLayout.X_AXIS));

cont_nations.setScrollableX(true);
cont_nations.setScrollVisible(false);

borderContainer.addComponent(BorderLayout.CENTER, cont_nations);

for (int i = 0; i < img_nations.length; i++) {
    final Button btn_nation = new Button(img_nations[i][0].image);

    cont_nations.addComponent(btn_nation);
}