我目前正在Codename One中编写一个简单的游戏,我希望用户选择国家。
我希望国家在可滚动列表中表示为图像。
我在X轴上有一个带BoxLayout的容器,里面有带图标的按钮。
问题是,容器中不适合的列表项目正在被裁剪,并且在应该的时候不会被绘制。此外,当手指在未拉伸的物品上方时,容器不可滚动。
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()一起使用的原因。
答案 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();
答案 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);
}