Codename One BoxLayout卷轴

时间:2015-12-03 00:56:46

标签: android ios codenameone

我目前正在Codename One中编写一个简单的游戏,我希望用户选择国家。

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

我在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,或者我应该用其他方式填充孩子或者为孩子使用另一个班级。 但我无法找到任何有关错误的信息。

修改

我尝试过Shai Almog的建议只使用setScrollableX(),但这并不是我需要的。 Container移动到左上角,不可滚动。

首先,我需要此滚动位于特定位置并具有特定大小,因此我使用CoordinateLayout作为Container的父级。 这就是我将setX(),setY()和setPreferredW()与setPreferredH()一起使用的原因。

2 个答案:

答案 0 :(得分:1)

您是否只想在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();

enter image description here

答案 1 :(得分:0)

我已经对BorderLayout和CoordinateLayout源代码进行了一些调查,但我找不到任何问题。 他们都正确地为孩子们调用了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);
}