怎么样实现在JTree上的MouseListener?

mercury1231 2003-04-02 03:17:42
我想在一个JTree上实现鼠标侦听。
要求如下:
鼠标点击必须是右键单击;
必须同时选中某一个节点, 如果没有选中则忽略;
弹出一个popup menu, 供用户进行选择;
用户选择了某弹出菜单项后,get到这个选中的节点对应的对象,进行一定操作。

具体的就跟MSN Messenger的联系人清单差不多。最好能够给出比较详细的做法。如果有代码就再好不过了。

另外再问一下,如何实现JTree中节点的图标定制(就是说根据节点的对象属性不同而图标改变,同时能实现动态更新),说白了还是像MSN Messenger一样。

当然也可以用其他结构实现,但是这里只考虑JTree。请帮帮忙。多谢。
...全文
173 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
roundy 2003-07-11
  • 打赏
  • 举报
回复
up
bjzhanghao 2003-04-03
  • 打赏
  • 举报
回复
mercury1231(呵呵,其实我什么都不懂),用我后面说的那种办法可以的,我以前做过。
mercury1231 2003-04-03
  • 打赏
  • 举报
回复
To: shine333(shine)

我正在用你和beyond_xiruo的办法写,看能不能搞定。
另外问一下,能不能直接extends DefaultTreeCellRenderer?而不是extends JLabel implements TreeCellRenderer?
mercury1231 2003-04-03
  • 打赏
  • 举报
回复
to: bjzhanghao(八进制)


不好意思,可能我说得不够清楚,第一个问题如果按照你的做法,要点在于怎么样判断是右键单击,好像TreeSelectionEvent没有办法判别。

第二个问题的话,只能统一所有的Leaf图标,不能定制和动态更新。

bjzhanghao兄有没有更好的办法?
bjzhanghao 2003-04-03
  • 打赏
  • 举报
回复
忽然发现自己五个三角了,呵呵
bjzhanghao 2003-04-03
  • 打赏
  • 举报
回复
参考
http://java.sun.com/docs/books/tutorial/uiswing/events/treeselectionlistener.html
这样的问题是如果点击当前已选中的节点则不会触发事件,另外一个办法是为JTree增加鼠标单击事件,然后利用getClosestPathForLocation(int x, int y)方法得到用户点击的TreePath,再用TreePath的getLastPathComponent() 得到所选中的节点(java核心技术swing卷上使用这种方法)
bjzhanghao 2003-04-03
  • 打赏
  • 举报
回复
事件(右键要自己根据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);
shine333 2003-04-03
  • 打赏
  • 举报
回复
我的思路跟 beyond_xiruo() 差不多,
重写一个MyTreeCellRenderer extends JLabel implements TreeCellRenderer, MouseListener把MouseListener直接写在TreeCellRenderer里面(boolean leaf==true时addMouseListener(this)),
图标也一样,比如selected的时候就setIcon(SELECTEDICON);......
mercury1231 2003-04-03
  • 打赏
  • 举报
回复
呵呵,看了半天,也没发现楼上的给的代码跟我的问题有什么关系。那些代码是讲怎么样implement一个最简单的树型结构。我的要求跟那个不一样。:)

不过还是谢谢你。
mim 2003-04-02
  • 打赏
  • 举报
回复
给你这段代码做参考!希望楼上的文档快点出来!

import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;

public class ToyView extends JApplet {
JTree toyTree;
JLabel d;
public URL url;
public void init(){

//创建一个容器
Container contentPane=getContentPane();
contentPane.setLayout(new BorderLayout());

//创建一个分隔面板
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);

creatNode();

int v=ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
int h=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
JScrollPane jsp=new JScrollPane(toyTree,v,h);
splitPane.setLeftComponent(jsp);

JPanel viewPanel=new JPanel();
d=new JLabel("欢迎光临!");
viewPanel.add(d);

splitPane.setRightComponent(viewPanel);

contentPane.add(splitPane,BorderLayout.CENTER);
}

public void creatNode(){
DefaultMutableTreeNode top1=new DefaultMutableTreeNode(new NodeModel(1,"所有玩具"));
DefaultMutableTreeNode parent = top1;

DefaultMutableTreeNode node2 = new DefaultMutableTreeNode(new NodeModel(2, "毛绒玩具"));
parent.add(node2);
parent=node2;
DefaultMutableTreeNode node3 = new DefaultMutableTreeNode(new NodeModel(3, "卡通动物"));
parent.add(node3);
DefaultMutableTreeNode node4 = new DefaultMutableTreeNode(new NodeModel(4, "卡通人物"));
parent.add(node4);

DefaultMutableTreeNode node5 = new DefaultMutableTreeNode(new NodeModel(5, "模型玩具"));
top1.add(node5);
parent=node5;
DefaultMutableTreeNode node6 = new DefaultMutableTreeNode(new NodeModel(6, "模型飞机"));
parent.add(node6);
DefaultMutableTreeNode node7 = new DefaultMutableTreeNode(new NodeModel(7, "模型汽车"));
parent.add(node7);
DefaultMutableTreeNode node8 = new DefaultMutableTreeNode(new NodeModel(8, "电话模型"));
parent.add(node8);

DefaultMutableTreeNode node9 = new DefaultMutableTreeNode(new NodeModel(9, "智力玩具"));
top1.add(node9);
parent=node9;
DefaultMutableTreeNode node10 = new DefaultMutableTreeNode(new NodeModel(10, "传统玩具"));
parent.add(node10);
DefaultMutableTreeNode node11 = new DefaultMutableTreeNode(new NodeModel(11, "拼图"));
parent.add(node11);
DefaultMutableTreeNode node12 = new DefaultMutableTreeNode(new NodeModel(12, "积木"));
parent.add(node12);
toyTree=new JTree(top1);

toyTree.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
TreeView_mouseClicked(e);
}
});

toyTree.getSelectionModel().setSelectionMode
(TreeSelectionModel.SINGLE_TREE_SELECTION);

//为叶子增加图片
try{
url=new URL(getDocumentBase(),"MIDDLE.gif");
}catch(MalformedURLException e){}
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
renderer.setLeafIcon(new ImageIcon(url));
toyTree.setCellRenderer(renderer);

toyTree.setShowsRootHandles(true);
toyTree.putClientProperty("JTree.lineStyle", "Angled");
toyTree.setEditable(false);
}

private void TreeView_mouseClicked(MouseEvent e){
TreePath path = toyTree.getPathForLocation(e.getX(),e.getY());
if( path == null ) return;
Object[] nodes = path.getPath();
for (int k=0; k<nodes.length; k++){
DefaultMutableTreeNode node = (DefaultMutableTreeNode)nodes[k];
NodeModel nd = (NodeModel)node.getUserObject();
if (nd.getId()==3){
d.setText("I love you1");
}else if(nd.getId()==4){
d.setText("4");
}else if(nd.getId()==6){
d.setText("6");
}else if(nd.getId()==7){
d.setText("7");
}else if(nd.getId()==8){
d.setText("8");
}else if(nd.getId()==10){
d.setText("10");
}else if(nd.getId()==11){
d.setText("11");
}else if(nd.getId()==12){
d.setText("12");
}
}
}
class NodeModel{
public int n_id;
public String n_name;
public NodeModel(int id,String name)
{
n_id=id;
n_name=name;
}
public String getName()
{
return n_name;
}
public String toString()
{
return n_name;
}
public int getId(){
return n_id;
}
}
}
希偌 2003-04-02
  • 打赏
  • 举报
回复
我正在编写这方面的文档,慢慢来,先给个定置图标的例子你看看
基本思路是写一个新类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());
....
geyf 2003-04-02
  • 打赏
  • 举报
回复
自己写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())

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧