我想创建一个GUI表来显示EObject
子类的给定功能列表。为此,我必须获取列标题的功能的显示名称。
如何以最佳方式获取功能显示名称?
如果我有一个类的实例,那么我可以使用适配器工厂来获得可以执行此操作的IItemPropertySource
:
SomeEntity e = ...
String displayName = adaptorFactory.adapt(e, IItemPropertySource.class)
.getPropertyDescriptor(null, feature).getDisplayName(null));
但是当表格为空时,没有SomeEntity
对象可用于获取IItemPropertySource
。
我可以用这种方式使用EFactory
创建一个虚拟对象:
EClass containingClass = feature.getEContainingClass();
SomeEntity dummy = containingClass.getEPackage().getEFactoryInstance()
.create(containingClass));
...然后使用该对象获取IItemPropertySource
。但这看起来有点像黑客。没有更好的解决方案吗?
答案 0 :(得分:2)
如果您在编译时知道该类,则可以自己创建ItemProviderAdapter
:
MyClassItemProvider provider = new MyClassItemProvider(adaptorFactory);
String name = provider.getPropertyDescriptor(null, property).getDisplayName(null);
如果您在编译时不知道该类,但在运行时只有EClass
实例,则事情会更复杂,因为必要的方法受到保护。你必须" make"他们先公开。
我会将相应的方法添加到生成的MyPackageSwitch
和MyPackageAdapterFactory
类(在myPackage.util中)。
在MyPackageAdapterFactory
:
/**
* @generated NOT
*/
public MyPackageSwitch<Adapter> getModelSwitch() {
return modelSwitch;
}
在MyPackageSwitch
:
/**
* generated NOT
*/
public T doPublicSwitch(EClass theEClass, EObject theEObject) {
return doSwitch(theEClass, theEObject);
}
现在,您可以为ItemProviderAdapter
EClass
创建theEClass
,如下所示:
provider = (ItemProviderAdapter) adapterFactory.getModelSwitch()
.doPublicSwitch(theEClass, null);
EMF显然不是为此而做的。请记住,只有在您没有使用EObject
值的任何自定义提供程序实现时,这一切才有效。