自己写treeUI实现MouseListener接口
比如:
public class MyUI extends BasicTreeUI implements MouseListener{
private void showPopupMenu(MouseEvent e){
//实现
}
//一堆MouseListener要实现的方法
......
public void mouseRelease(MouseEvent e){showPopupMenu(e);}
}
jtree.setUI(new MyUI())

解决方案 »

  1.   

    我正在编写这方面的文档,慢慢来,先给个定置图标的例子你看看
    基本思路是写一个新类MyNode扩展DefaultMutableTreeNode,里面有一个属性icon。
    用这个新类构造树。
    再写一个新类MyCellRenderer
     class MyCellRenderer extends JLabel implements TreeCellRenderer{
        public Component getTreeCellRendererComponent(JTree tree,Object value,boolean selected,boolean expanded,boolean leaf,int row,boolean hasFocus){
           DefaultMutableTreeNode node=(DefaultMutableTreeNode)value;
           if(node instanceof MyNode){
             setText(((MyNode)node).getText());
             setIcon(new ImageIcon(((MyNode)node).getIcon()));
             //这里针对单个节点还可以进行其他设置....
           }
           return this;
        }
     }tree.setCellRenderer(new MyCellRenderer());
    ....
      

  2.   

    呵呵,看了半天,也没发现楼上的给的代码跟我的问题有什么关系。那些代码是讲怎么样implement一个最简单的树型结构。我的要求跟那个不一样。:)不过还是谢谢你。
      

  3.   

    我的思路跟 beyond_xiruo() 差不多,
    重写一个MyTreeCellRenderer extends JLabel implements TreeCellRenderer, MouseListener把MouseListener直接写在TreeCellRenderer里面(boolean leaf==true时addMouseListener(this)),
    图标也一样,比如selected的时候就setIcon(SELECTEDICON);......
      

  4.   

    事件(右键要自己根据e判断一下)
    //Listen for when the selection changes.
    tree.addTreeSelectionListener(new TreeSelectionListener() {
        public void valueChanged(TreeSelectionEvent e) {
            DefaultMutableTreeNode node = (DefaultMutableTreeNode)
                               tree.getLastSelectedPathComponent();
            
            if (node == null) return;        Object nodeInfo = node.getUserObject();
            if (node.isLeaf()) {
                BookInfo book = (BookInfo)nodeInfo;
                displayURL(book.bookURL);
            } else {
                displayURL(helpURL); 
            }
        }
    });
    换图标
    DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
    renderer.setLeafIcon(new ImageIcon("images/middle.gif"));
    tree.setCellRenderer(renderer);
      

  5.   

    参考
    http://java.sun.com/docs/books/tutorial/uiswing/events/treeselectionlistener.html
    这样的问题是如果点击当前已选中的节点则不会触发事件,另外一个办法是为JTree增加鼠标单击事件,然后利用getClosestPathForLocation(int x, int y)方法得到用户点击的TreePath,再用TreePath的getLastPathComponent() 得到所选中的节点(java核心技术swing卷上使用这种方法)
      

  6.   

    to:  bjzhanghao(八进制) 
    不好意思,可能我说得不够清楚,第一个问题如果按照你的做法,要点在于怎么样判断是右键单击,好像TreeSelectionEvent没有办法判别。第二个问题的话,只能统一所有的Leaf图标,不能定制和动态更新。bjzhanghao兄有没有更好的办法?
      

  7.   

    To:  shine333(shine)我正在用你和beyond_xiruo的办法写,看能不能搞定。
    另外问一下,能不能直接extends DefaultTreeCellRenderer?而不是extends JLabel implements TreeCellRenderer?
      

  8.   

    mercury1231(呵呵,其实我什么都不懂),用我后面说的那种办法可以的,我以前做过。