PropertyView 中的 Java Eclipse 多行/列表属性
Posted
技术标签:
【中文标题】PropertyView 中的 Java Eclipse 多行/列表属性【英文标题】:Java Eclipse multiline/list property in PropertyView 【发布时间】:2016-03-24 08:58:50 【问题描述】:我有一个带有对象的 TreeViewer
,我想在 Eclipse 的默认 PropertiesView
中显示信息。我创建了一个 AdapterFactory,它使用 Override 方法实现了 IAdapterFactory
接口:
@Override
public Object getAdapter(Object adaptableObject, Class adapterType)
if(adapterType == IPropertySource.class && adaptableObject instanceof UATreeNode)
return new UATreeNodeAdapter((UATreeNode) adaptableObject);
return null;
然后我创建了一个适配器,它使用我自己的 PropertyDescriptors 实现了IPropertySource
接口,例如:
public static final String OBJECT_ID_VALUE = "Obj.value";
private static final String OBJECT_LABEL_VALUE = "Value";
private static final String CATEGORY_VALUE = "Value";
protected PropertyDescriptor objectAccessLevelDescriptor = new PropertyDescriptor(OBJECT_ID_VALUE, OBJECT_LABEL_VALUE);
@Override
public IPropertyDescriptor[] getPropertyDescriptors()
objectValueDescriptor.setCategory(CATEGORY_VALUE);
return new IPropertyDescriptor[] objectValueDescriptor ;
@Override
public Object getPropertyValue(Object id)
if(id.equals(OBJECT_ID_VALUE))
return uaTreeNode.getValue();
其中一些属性应该显示一个字符串列表,
Value
---String 1
---String 2
---String 3
Example how it should look like
“Value”的第一次出现是我设置的类别,但第二次出现应该已经显示了我提供的列表的实际值。
问题是,列表是动态的,并且在我的 TreeNode 之间可能会有所不同。 我现在的问题是,有没有办法做到这一点,我怎样才能实现我想要的?
【问题讨论】:
【参考方案1】:如果您的getPropertyValue
方法返回一个实现或适应IPropertySource
的对象,那么来自该属性源的属性描述符将用于创建子节点。
因此,在您的示例中,您需要一个属性源返回三个字符串的三个描述符。
【讨论】:
好的,带有子节点的部分现在对我有用,但是我怎样才能实现动态设置多个描述符?我不知道我的清单的确切长度。 在调用对象的 getPropertyValue 时,您必须创建一个具有正确数量描述符的属性源对象。【参考方案2】:这可能不是最好的解决方案,但这是我所做的:
我创建了一个新类,它也实现了IPropertySource
接口:
public class UATreeNodeValue implements IPropertySource
public static final String OBJECT_ID_STARTTIME = "Obj.startTime";
public static final String OBJECT_ID_CURRENTTIME = "Obj.currentTime";
public static final String OBJECT_ID_STATE = "Obj.state";
private static final String OBJECT_LABEL_STARTTIME = "StartTime";
private static final String OBJECT_LABEL_CURRENTTIME = "CurrentTime";
private static final String OBJECT_LABEL_STATE = "State";
String size = "";
String objectType = "";
ArrayList<String> arrayList = new ArrayList<String>();
protected PropertyDescriptor descriptor;
protected PropertyDescriptor objectStartTimeDescriptor = new PropertyDescriptor(
OBJECT_ID_STARTTIME, OBJECT_LABEL_STARTTIME);
protected PropertyDescriptor objectCurrentTimeDescriptor = new PropertyDescriptor(
OBJECT_ID_CURRENTTIME, OBJECT_LABEL_CURRENTTIME);
protected PropertyDescriptor objectStateDescriptor = new PropertyDescriptor(
OBJECT_ID_STATE, OBJECT_LABEL_STATE);
public UATreeNodeValue()
public void addValues(String value)
arrayList.add(value);
public void setObjectType(String string)
objectType = string;
@Override
public IPropertyDescriptor[] getPropertyDescriptors()
IPropertyDescriptor[] iPropertyDescriptor = new IPropertyDescriptor[arrayList.size()];
if(objectType.equals("ServerStatusDataType"))
return new IPropertyDescriptor[] objectStartTimeDescriptor, objectCurrentTimeDescriptor,
objectStateDescriptor ;
else
for(int i = 0; i < arrayList.size(); i++)
size = "[" + i + "]";
iPropertyDescriptor[i] = new PropertyDescriptor("obj." + "[" + i + "]", size);
return iPropertyDescriptor;
@Override
public Object getPropertyValue(Object id)
if(objectType.equals("ServerStatusDataType"))
if(id.equals(OBJECT_ID_STARTTIME))
return arrayList.get(0);
if(id.equals(OBJECT_ID_CURRENTTIME))
return arrayList.get(1);
if(id.equals(OBJECT_ID_STATE))
return arrayList.get(2);
else
if(id.equals("obj." + "[" + 0 + "]"))
return arrayList.get(0);
if(id.equals("obj." + "[" + 1 + "]"))
return arrayList.get(1);
if(id.equals("obj." + "[" + 2 + "]"))
return arrayList.get(2);
if(id.equals("obj." + "[" + 3 + "]"))
return arrayList.get(3);
if(id.equals("obj." + "[" + 4 + "]"))
return arrayList.get(4);
if(id.equals("obj." + "[" + 5 + "]"))
return arrayList.get(5);
if(id.equals("obj." + "[" + 6 + "]"))
return arrayList.get(6);
return null;
注意:为了简化,我在这里删除了一些部分。
对于特殊情况,我实现了属性的名称,但在所有其他情况下,它只是显示数字,例如 [1],作为名称。
在我上面的问题中提到的适配器类中,我只是返回值:
UATreeNodeAdapter 类也实现了IPropertySource
接口:
@Override
public Object getPropertyValue(Object id)
if(id.equals(OBJECT_ID_VALUE))
return uaTreeNode.getValue();
return null;
UATreeNode 类:
public class UATreeNode
private UATreeNodeValue value = null;
public UATreeNodeValue getValue()
return value;
public void setValue(UATreeNodeValue value)
this.value = value;
我希望我可以帮助有类似问题的人。 感谢 greg-449 的帮助。
【讨论】:
以上是关于PropertyView 中的 Java Eclipse 多行/列表属性的主要内容,如果未能解决你的问题,请参考以下文章
Java:Eclipse 中的行号与命令行中的行号相同吗? [关闭]