我们的建议是avoid ComboBox。这是一种UI本身并不存在的UI模式,在现代手机上会感觉陌生。它存在于Codename One中。
在从样品这段代码上面你可以得到一个复杂的多场组合框类似的效果:如果你坚持使用ComboBox
你可以使用一个模型
Form hi = new Form("Button", BoxLayout.y());
String[] characters = { "Tyrion Lannister", "Jaime Lannister", "Cersei Lannister"};
String[] actors = { "Peter Dinklage", "Nikolaj Coster-Waldau", "Lena Headey"};
int size = Display.getInstance().convertToPixels(7);
EncodedImage placeholder = EncodedImage.createFromImage(Image.createImage(size, size, 0xffcccccc), true);
Image[] pictures = {
URLImage.createToStorage(placeholder, "tyrion","http://i.lv3.hbo.com/assets/images/series/game-of-thrones/character/s5/tyrion-lannister-512x512.jpg"),
URLImage.createToStorage(placeholder, "jaime","http://i.lv3.hbo.com/assets/images/series/game-of-thrones/character/s5/jamie-lannister-512x512.jpg"),
URLImage.createToStorage(placeholder, "cersei","http://i.lv3.hbo.com/assets/images/series/game-of-thrones/character/s5/cersei-lannister-512x512.jpg")
};
MultiButton b = new MultiButton("Pick A Lanister...");
b.addActionListener(e -> {
Dialog d = new Dialog();
d.setLayout(BoxLayout.y());
d.getContentPane().setScrollableY(true);
for(int iter = 0 ; iter < characters.length ; iter++) {
MultiButton mb = new MultiButton(characters[iter]);
mb.setTextLine2(actors[iter]);
mb.setIcon(pictures[iter]);
d.add(mb);
mb.addActionListener(ee -> {
b.setTextLine1(mb.getTextLine1());
b.setTextLine2(mb.getTextLine2());
b.setIcon(mb.getIcon());
d.dispose();
b.revalidate();
});
}
d.showPopupDialog(b);
});
hi.add(b);
hi.show();
给它任何你想要的对象数据。然后创建一个单元格渲染器来显示数据。这一切都在component section of Codname One's developer guide深入讨论。请注意,由于ComboBox
来自List
大多数List
提示和文档适用于ComboBox
。
谢谢Shai的快速回复。我意识到组合框不是我们要走的路,我喜欢Multibutton的想法。唯一不确定的是如何检索选定项目的ID。 我相信应该有一种方法来获取所选项目的值。我会试一试。 谢谢。 – Ravimaran
你可以使用get/putClientProperty()在组件上存储元数据看看我的答案在这里:http://stackoverflow.com/questions/40774454/codenameone-refresh-list-of-images-without-reloading-the-页面 –
谢谢Shai。我会试一试。我一直很享受这一点。 – Ravimaran