首页 文章

Codename One BoxLayout卷轴

提问于
浏览
0

我目前正在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,或者我应该用其他方式填充孩子或者为孩子使用另一个 class . 但我找不到任何有关错误的信息 .

EDIT

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

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

2 回答

  • 0

    是否只想在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

    我已经对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);
    }
    

相关问题