Codenameone 从设计器获取UI资源

Codenameone 从设计器获取UI资源,codenameone,Codenameone,我很努力地在API中找到如何获取UI资源。我可以获取UI资源名称,但不能获取实际资源: fetchResourceFile().getUIResourceNames() 我试图实现的是,我已经在designer中设计了一个小组件,我想在它显示之前将它添加到表单中 是否可以在代码中获取UI组件?使用简单的getter可以获取的大多数资源,例如getImage()等 UI元素更复杂,因为它们绑定到UIBuilder类。我们在设计时的目标是为不需要GUI builder功能的开发人员保持非常小的二进

我很努力地在API中找到如何获取UI资源。我可以获取UI资源名称,但不能获取实际资源:

fetchResourceFile().getUIResourceNames()
我试图实现的是,我已经在designer中设计了一个小组件,我想在它显示之前将它添加到表单中


是否可以在代码中获取UI组件?

使用简单的getter可以获取的大多数资源,例如
getImage()

UI元素更复杂,因为它们绑定到
UIBuilder
类。我们在设计时的目标是为不需要GUI builder功能的开发人员保持非常小的二进制大小,因此我们不想创建从
资源
类到
UIBuilder
类的依赖关系

因此,要从设计器加载UI组件,需要反向使用API:

UIBuilder uib = new UIBuilder();
Container cnt = uib.createContainer(resource, name);
请注意,由于
表单
对话框
容器
的子类,因此您可以在适当的地方自然地向下转换到它们


另外请注意,如果您有一个
Statemachine
类,它是
UIBuilder
的一个子类,因此您当前不需要创建一个新的
UIBuilder
实例…

如果我在designer中使用用户定义的容器,它将被复制,而不是被引用。如果用户定义容器中的所有更改都应用于该组件的所有实例,那就太好了,否则很容易出错,并且很容易忘记在所有位置更新组件,而且在designer中没有自动的方法来找出用户定义容器的使用位置。目前我找到的唯一解决方法是在代码中而不是在设计器中添加这些用户定义的容器。它将始终是一个新实例。由于资源文件仅包含字节数据,而不包含实例,因此该设计用于创建新实例。如果它包含实例,您将很快耗尽内存(因为图标等都将扩展为位图)。GUI builder的基本设计是通过丢弃表单实例并重新创建它们来节省RAM。在运行时创建新实例绝对有意义。然而,我的问题只与UI builder有关。我指的是设计器模式下用户定义容器的实例。依我看,它应该更像“包含”。例如,假设我有两种不同形式的按钮栏。为简单起见,我将使这些包含的栏在表单生成器中不可编辑,而仅在其自己的生成器中可编辑。然后新的更改应用到按钮栏,它们被正确地填充到表单中。实例化将保持不变。如果处于状态机中,只需使用findComponentName(…)。如果不需要,只需使用findByName(…)来查找实例。真的不清楚你想做什么。我会解释的。我在designer中有用户定义的容器。最初,我在designer中将这个容器添加到两个表单中,但后来发现它被复制了,当我更改它时,它并没有在任何地方都被更改。这就是我在代码中添加此组件的原因。无论如何,我实现了我想要的,但我想说的是,在designer中不能有效地使用用户定义的容器听起来是不对的。