自己写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())
比如:
public class MyUI extends BasicTreeUI implements MouseListener{
private void showPopupMenu(MouseEvent e){
//实现
}
//一堆MouseListener要实现的方法
......
public void mouseRelease(MouseEvent e){showPopupMenu(e);}
}
jtree.setUI(new MyUI())
基本思路是写一个新类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());
....
重写一个MyTreeCellRenderer extends JLabel implements TreeCellRenderer, MouseListener把MouseListener直接写在TreeCellRenderer里面(boolean leaf==true时addMouseListener(this)),
图标也一样,比如selected的时候就setIcon(SELECTEDICON);......
//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);
http://java.sun.com/docs/books/tutorial/uiswing/events/treeselectionlistener.html
这样的问题是如果点击当前已选中的节点则不会触发事件,另外一个办法是为JTree增加鼠标单击事件,然后利用getClosestPathForLocation(int x, int y)方法得到用户点击的TreePath,再用TreePath的getLastPathComponent() 得到所选中的节点(java核心技术swing卷上使用这种方法)
不好意思,可能我说得不够清楚,第一个问题如果按照你的做法,要点在于怎么样判断是右键单击,好像TreeSelectionEvent没有办法判别。第二个问题的话,只能统一所有的Leaf图标,不能定制和动态更新。bjzhanghao兄有没有更好的办法?
另外问一下,能不能直接extends DefaultTreeCellRenderer?而不是extends JLabel implements TreeCellRenderer?