http://blogs.oracle.com/geertjan/entry/better_childfactory
————————————————————————————————————————————————————————————————————————
Thanks to Jesse, here's a corrected & improved ChildFactory from a few days ago, using ChildFactory.Detachable so that you have addNotify/removeNotify to add/remove the LookupListener and thus avoid a memory leak, together with a createKeys/resultChanged that is simplified too.
private class FirstLevelChildFactory extends ChildFactory.Detachable<ResultType> implements LookupListener {
Result<ResultSet> resultRetrievedFromYahoo;
@Override
protected void addNotify() {
resultRetrievedFromYahoo = Utilities.actionsGlobalContext().lookupResult(ResultSet.class);
resultRetrievedFromYahoo.addLookupListener(this);
}
@Override
protected void removeNotify() {
resultRetrievedFromYahoo.removeLookupListener(this);
resultRetrievedFromYahoo = null;
}
@Override
protected boolean createKeys(List<ResultType> list) {
for (ResultSet rs : resultRetrievedFromYahoo.allInstances()) {
list.addAll(rs.getResult());
}
return true;
}
@Override
protected Node createNodeForKey(ResultType key) {
String[] split = key.getTitle().split(" ");
String theNextWordToBeSearched = split[split.length - 1];
AbstractNode firstLevelNode =
new AbstractNode(
Children.create(new GenericChildFactory(theNextWordToBeSearched), true),
Lookups.singleton(key));
firstLevelNode.setShortDescription(key.getSummary());
firstLevelNode.setDisplayName(key.getTitle());
return firstLevelNode;
}
@Override
public void resultChanged(LookupEvent le) {
refresh(true);
}
}
Result<ResultSet> resultRetrievedFromYahoo;
@Override
protected void addNotify() {
resultRetrievedFromYahoo = Utilities.actionsGlobalContext().lookupResult(ResultSet.class);
resultRetrievedFromYahoo.addLookupListener(this);
}
@Override
protected void removeNotify() {
resultRetrievedFromYahoo.removeLookupListener(this);
resultRetrievedFromYahoo = null;
}
@Override
protected boolean createKeys(List<ResultType> list) {
for (ResultSet rs : resultRetrievedFromYahoo.allInstances()) {
list.addAll(rs.getResult());
}
return true;
}
@Override
protected Node createNodeForKey(ResultType key) {
String[] split = key.getTitle().split(" ");
String theNextWordToBeSearched = split[split.length - 1];
AbstractNode firstLevelNode =
new AbstractNode(
Children.create(new GenericChildFactory(theNextWordToBeSearched), true),
Lookups.singleton(key));
firstLevelNode.setShortDescription(key.getSummary());
firstLevelNode.setDisplayName(key.getTitle());
return firstLevelNode;
}
@Override
public void resultChanged(LookupEvent le) {
refresh(true);
}
}
This is a very simple & elegant solution.
——————————————————————————————————
傲轩游戏网
傲轩游戏网