2015-12-03 115 views
0

我目前正在使用Codename One编写一个简单的游戏,我希望用户选择国家。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); 
    } 

我知道我做错了。 也许我不应该使用容器,或者我应该用另一种方式用孩子填充它,或者为孩子使用另一个班级。 但我找不到任何信息出了什么问题。

编辑

我试过夏嘉曦阿尔莫格的建议,使用setScrollableX()而已,但我需要一个没有工作。 容器移动到左上角并且不可滚动。

起初,我需要这个卷轴位于特定的位置并具有特定的大小,所以我使用CoordinateLayout作为Container的父级。 这就是为什么我用setPreferredH()使用setX(),setY()和setPreferredW()。

回答

0

我已经做了一些investi到BorderLayout和CoordinateLayout源代码,但我找不到任何问题。 他们都正确地为孩子们调用了setWidth()和setHeight()方法。

但是,我注意到,如果我将容器放到BorderLayout中,则滚动会根据需要进行工作,所以我想出了一个创建BorderLayout容器和Scrollable Container的想法,并将其放置在应该放置的位置。

我仍然认为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); 
} 
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

+0

我无法检查它,所以我现在稍后会做,但我记得,没有工作。 容器没有滚动,因为它的大小取决于它的孩子。 – geNia

+0

图像应占用空间,滚动只会在需要时触发。这是它应该如此工作的方式,从此开始并继续。 –

+0

我试过了你的建议,但没有奏效。看到我的编辑问题。 – geNia