BeanTreeView:如何在原生“属性”窗口中显示所选树项的属性?

问题描述 投票:0回答:1

我的项目需要使用 BeanTreeView,因此我在本指南中练习使用该组件: 教程

完整的源代码如下: 源代码

我想在本机“属性”窗口中显示所选树项(事件)的属性,这行代码应提供:

associateLookup(ExplorerUtils.createLookup(mgr, getActionMap()));

不幸的是,所选树项的属性没有显示在“属性”窗口中,为什么?

java netbeans netbeans-platform
1个回答
0
投票

还有另一个教程描述了您需要的内容:

https://netbeans.apache.org/tutorial/main/tutorials/nbm-nodesapi2/#_creating_a_node_subclass

https://netbeans.apache.org/tutorial/main/tutorials/nbm-nodesapi2/#_properties_and_the_property_sheet

您基本上必须在“我的编辑器”项目中进行一些更改。

介绍一个新班级

EventNode
:

package org.myorg.myeditor;

import java.time.ZonedDateTime;
import org.myorg.myapi.Event;
import org.openide.ErrorManager;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.PropertySupport;
import org.openide.nodes.Sheet;
import org.openide.util.lookup.Lookups;

public class EventNode extends AbstractNode {

    public EventNode(Event obj) {
        super(Children.create(new EventChildFactory(), true), Lookups.singleton(obj));
        setDisplayName("Event " + obj.getIndex());
    }

    public EventNode() {
        super(Children.create(new EventChildFactory(), true));
        setDisplayName("Root");
    }

    @Override
    protected Sheet createSheet() {
        Sheet sheet = Sheet.createDefault();
        Sheet.Set set = Sheet.createPropertiesSet();
        Event obj = getLookup().lookup(Event.class);

        try {
            Property indexProp = new PropertySupport.Reflection(obj, Integer.class, "getIndex", null);
            Property dateProp = new PropertySupport.Reflection(obj, ZonedDateTime.class, "getDate", null);

            indexProp.setName("index");
            dateProp.setName("date");

            set.put(indexProp);
            set.put(dateProp);
        } catch (NoSuchMethodException ex) {
            ErrorManager.getDefault();
        }

        sheet.put(set);
        return sheet;
    }
}

更改

MyEditor
的构造函数:

public MyEditor() {
    initComponents();
    Event obj = new Event();
    associateLookup(ExplorerUtils.createLookup(mgr, getActionMap()));

    setLayout(new BorderLayout());
    add(new BeanTreeView(), BorderLayout.CENTER);

    setDisplayName("MyEditor " + obj.getIndex());
//        mgr.setRootContext(new AbstractNode(Children.create(new EventChildFactory(), true))); // remove this line
    mgr.setRootContext(new EventNode());    // and add this one instead
}

并在

EventChildFactory
中更改
createNodeForKey
方法:

@Override
protected Node createNodeForKey(Event key) {
    return new EventNode(key);
}
© www.soinside.com 2019 - 2024. All rights reserved.