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 中的行号与命令行中的行号相同吗? [关闭]

Eclipse中的创建maven项目,无法添加src/main/java等source folder

Eclipse 使用过程中的问题及解决方法

在 Java 中嵌入 Office

在 Java 中编码为 Base64

Eclipse 中的 NoClassDefFoundError