————————————————————————————————————————————————————————————————————————
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); } }
This is a very simple & elegant solution.
转载于:https://www.cnblogs.com/cuizhf/archive/2011/09/25/2189950.html
