java的事件模型有一个加入监听的步骤,如果你自己想发送事件到所有监听者,你需要作许多事情,需要了解事件的类型、源。 而且不同的事件不兼容。 总之,很麻烦!

解决方案 »

  1.   

    TreeSelectionListener事件中需处理的事情做成一个方法,
    dragOver事件中直接调用这个方法不行吗?hoho~
      

  2.   

    但是要想画树的话,只能是让系统触发DefaultTreeCellRenderer吧,
    你调用DefaultTreeCellRenderer中的getTreeCellRendererComponent获得JLabel,只能获得那个节点,并不能重绘这个节点的。下面是我的程序:(this是属对象)
    DefaultTreeCellRenderer render = (DefaultTreeCellRenderer)this.getCellRenderer();
    JLabel node1=(JLabel)render.getTreeCellRendererComponent(this,node.toString(),true,true,false,node.getLevel(),false);
    System.out.println(node1.getText());
    System.out.println(node1.getIcon().toString());
    this.repaint();
    //this.validate();
    节点的值通过log判断是正确的,但是通过this.repaint等并不能重画,很简单,因为没有加到树上。
      

  3.   

    有两种重绘树节点的方法.
    一种是继承DefaultTreeCellRenderer,在getTreeCellRendererComponent方法中判断某条件根据不同情况用不同的图片来显示树节点.
    第二种方法是直接实现TreeCellRenderer接口.DefaultTreeCellRenderer是继承JLabel并实现TreeCellRenderer接口,所以DefaultTreeCellRenderer显示的实际是一个JLabel,你可以让你的TreeCellRenderer继承任何其它Component的某个子类并实现TreeCellRenderer接口,这时树中的节点形状将会是你的那个Component的子类的形状.你是不是把问题想的复杂化了,鼠标拖动无非就是按下->移动->松开的一个过程,这三个过程都会触发相应的事件,你只要在这些事件中进行处理就行了.
    例如拖动树节点:鼠标按下,得到选择的树节点;拖动,修改鼠标形状;鼠标松开,得到拖动到的目标位置,然后进行处理:从树中切除鼠标按下时选择的树节点,在鼠标松开的树节点下加入这个树节点,刷新树,OK!