2015-12-03 113 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