代码之家  ›  专栏  ›  技术社区  ›  dcstraw

使用setCurrentID时,在TOC中选择JavaHelp主题

  •  2
  • dcstraw  · 技术社区  · 16 年前

    当我使用 HelpBroker.setCurrentID("[some help id]") ,JavaHelp会正确显示我想要的页面,但相关主题不会在目录中自动选择/突出显示。这使得用户很难知道当前页面在主题树中的位置。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Matt Blaine    16 年前

    你应该可以打电话给 navigate() 其他人都是帮手。 id nodeLabel 是要选择的节点上的可见文本。请注意,此代码不会检查错误,即阻止尝试去不存在的地方。

    import java.awt.Component;
    import java.util.Enumeration;
    import javax.help.*;
    import javax.help.plaf.basic.BasicTOCNavigatorUI;
    import javax.swing.JTree;
    import javax.swing.JScrollPane;
    import javax.swing.tree.TreeModel;
    import javax.swing.tree.TreePath;
    import javax.swing.tree.DefaultMutableTreeNode;
    
    public class Nav
    {
        private static DefaultMutableTreeNode match = null;
    
        private Nav()
        {
        }
    
        public static void navigate(HelpSet set, HelpBroker broker, String id, String nodeLabel)
        {
            broker.setCurrentID(id);
            JHelp jhelp = new JHelp(set);
            JHelpNavigator nav = getNavigator(jhelp);
            JTree tree = getTree(nav);
            TreeModel model = tree.getModel();
            Object root = model.getRoot();
            match = null;
            findNode(model, root, nodeLabel);
            TreePath path = new TreePath(match.getPath());
            tree.setSelectionPath(path);
            tree.scrollPathToVisible(path);
        }
    
        //http://www.google.com/codesearch/p?hl=en#WiboLAWeTd0/xena/ext/src/javahelp/jhMaster/JavaHelp/src/new/javax/help/WindowPresentation.java&t=0&d=30&l=272
        private static JHelpNavigator getNavigator(JHelp jhelp)
        {
            JHelpNavigator nav = null;
            for (Enumeration e = jhelp.getHelpNavigators(); e.hasMoreElements(); ) 
            {
                nav = (JHelpNavigator) e.nextElement();
                if (nav.getNavigatorName().equals("TOC"))
                {
                    return nav;
                }
            }
            return null;
        }
    
        //http://forums.sun.com/thread.jspa?threadID=350180#1459484
        private static JTree getTree(JHelpNavigator nav)
        {
            JTree tree = null;
            Component[] components = nav.getComponents();
            int count = components.length;
            int i = 0;
            while(i < count && !(components[i] instanceof JScrollPane))
            {
                i++;
            }
            if(i < count)
            {
                JScrollPane sp = (JScrollPane) components[i];
                components = sp.getViewport().getComponents();
                count = components.length;
                i = 0;
                while(i < count && !(components[i] instanceof JTree))
                {
                    i++;
                }
                tree = (JTree) components[i];
            }
            return tree;
        }
    
        //http://www.rkcole.com/articles/swing/TraverseJtree-2000-11-17.html
        private static void findNode(TreeModel model, Object o, String search)
        {
            if(match != null)
                return;
    
            int count = model.getChildCount(o);
            for( int i=0;  i < count;  i++ )
            {
                Object child = model.getChild(o, i );
                if (  model.isLeaf( child ) )
                {
                    if(search.equals(((TOCItem)((DefaultMutableTreeNode)child).getUserObject()).getName()))
                    {
                        match = (DefaultMutableTreeNode)child;
                        return;
                    }
                }
                else
                    findNode( model, child, search );
            }
        }
    }
    
        2
  •  1
  •   Mr.Wizard naktepe    15 年前

    您正在使用合并的帮助集吗?如果我使用setCurrentID(“topic”),并且topic不是主帮助集,而是在子帮助集中,我会得到您看到的行为。你想做的是

    setCurrentID(javax.help.Map.ID.create("topic",subhelpset))
    

    对我来说,这使得TOC视图选择正确发生。当然,这可能意味着您需要使用动态合并的帮助集,因为如果子帮助集是在主帮助集的.hs文件中指定的,我看不到(立即)一种简单的方法来查找它。

    类似地,对于上下文相关的帮助,您需要在每个组件上设置ID和helpset。