我的项目需要使用 BeanTreeView,因此我在本指南中练习使用该组件: 教程
完整的源代码如下: 源代码
我想在本机“属性”窗口中显示所选树项(事件)的属性,这行代码应提供:
associateLookup(ExplorerUtils.createLookup(mgr, getActionMap()));
不幸的是,所选树项的属性没有显示在“属性”窗口中,为什么?
还有另一个教程描述了您需要的内容:
https://netbeans.apache.org/tutorial/main/tutorials/nbm-nodesapi2/#_creating_a_node_subclass
和
您基本上必须在“我的编辑器”项目中进行一些更改。
介绍一个新班级
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);
}