我正在使用CN1构建我的应用程序,我想创建一个用户可以搜索的屏幕,并从可用的材料字体图像列表中进行选择。我怎么能得到这份清单,即。我将需要char代码(“\ uE900”)和要搜索的描述。我非常想复制CN1在他们酷炫的新Guibuilder中构建的对话框。
通过使用相同的方法,这有望意味着当CN1团队添加更多内容时,列表将自动增长。
我曾想过将Github中的FontImage类文本解构为可管理的列表,但不认为这是未来的证明。
一旦我有了这个列表,那么我可以使用以下方法将它应用于Button tile网格:
gui_IconButton.setIcon(
FontImage.createFixed("\uE900", FontImage.getMaterialDesignFont(), 0xffffff, 20, 20).toImage());
虽然也许有一种更简洁的实施方式,它可以提供与上图相同的LAF。
提前谢谢了。
为该对话框做了什么是这样的:
private static List<MaterialFont> getMaterialFonts(){
ArrayList<MaterialFont> list = new ArrayList<>();
list.add(new MaterialFont(FontImage.MATERIAL_3D_ROTATION, "3d rotation"));
list.add(new MaterialFont(FontImage.MATERIAL_AC_UNIT, "ac unit"));
list.add(new MaterialFont(FontImage.MATERIAL_ACCESS_ALARM, "access alarm"));
list.add(new MaterialFont(FontImage.MATERIAL_ACCESS_ALARMS, "access alarms"));
list.add(new MaterialFont(FontImage.MATERIAL_ACCESS_TIME, "access time"));
...
}
static class MaterialFont implements Comparable<MaterialFont>{
private char icon;
private String description;
public MaterialFont(char icon, String description) {
this.icon = icon;
this.description = description;
}
@Override
public int compareTo(MaterialFont o) {
return description.compareTo(((MaterialFont)o).description);
}
}
这是有问题的。由于我们没有反射,因此我们添加新图标时难以维护。我不认为该列表包含我们最近添加的新图标。
我认为更好的方法是一个单独的类,它只包含类的元数据,这将允许优化器在不使用元数据类时删除未使用的图标。此类不需要是Codename One的一部分,可以使用脚本“自动生成”。
如果你是像我这样的Unix人,那么这个语句将生成list.add()
条目:
javap -classpath ~/dev/cn1/CodenameOne/dist/CodenameOne.jar com.codename1.ui.FontImage | grep MATERIAL_ | sed 's/ public static final char //' | sed 's/MATERIAL_*//g' | sed 's/;//' | sed 's/.*/ list.add(new MaterialFont(FontImage.MATERIAL_&, "&");/'
然后你可以只做一个MetaData页眉和页脚,并将sed命令的输出与cat
命令结合起来。