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

r7s23pms  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(59)

我需要在我的项目中使用BeanTreeView,所以我在本指南中练习使用此组件:Tutorial
以下是完整的源代码:Source code
我想在本机“属性”窗口中显示所选树项(事件)的属性,这行代码应该提供:associateLookup(ExplorerUtils.createLookup(mgr, getActionMap()));
不幸的是,所选树项目的属性没有显示在“属性”窗口中,为什么?

brvekthn

brvekthn1#

这正是我感兴趣的。非常感谢约阿希姆的现成例子。
当我写一个关键行:
第一个月
我之前看过这个视频guide,其中这一行足以显示对象的属性,但在这个解决方案中,第一行不必要,显示其属性的类的名称。
您的解决方案要好得多,因为我可以自由定义应该显示哪个属性以及它应该具有什么名称。
再次感谢您的帮助!

m2xkgtsf

m2xkgtsf2#

还有另一个教程描述了您需要的内容:
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);
}

相关问题