就是说当我在我的JTree上从一个节点A移到另一个节点B的时候,触发的是TreeSelection的事件,但是这个事件的现态是已经在B那儿了,我是想问有没有除了TreeSelection之外的listener,可以触发我想移动但却还没有移动的那一瞬间的事件?谢谢

解决方案 »

  1.   

    能不能根据ChangedEvent事件从新定义一个,读取ChangedEvent的值
      

  2.   

    嗯,我试过了,但是可恶的是changeEvent事件总是在treeselection后触发,而我所做的事情都是要在TreeSelection事件中发生的,但是需要在changeEvent事件中取到指才行,郁闷啊。
      

  3.   

    jTree1.addTreeSelectionListener(new TreeSelectionListener() {
          public void valueChanged(TreeSelectionEvent evt) {
            // Get all nodes whose selection status has changed
            TreePath[] paths = evt.getPaths();        // Iterate through all affected nodes
            for (int i=0; i<paths.length; i++) {
              if (evt.isAddedPath(i)) {
                System.out.println("被选中 " + paths[i].toString());
              } else {
                System.out.println("取消选中"+ paths[i].toString());
              }
            }
          }
        });
      

  4.   

    你是否想操作上一次选择的树节点?那样的话用一个全局变量记录lastPathComponentjiu 就好了
      

  5.   

    public void valueChanged(TreeSelectionEvent event){
         int changeFlag = 0;
         int nodeAttrFlag = 0; TreePath treePath = event.getOldLeadSelectionPath();
    mOldTreePath = treePath;
    Node lastNode = null;
    DefaultMutableTreeNode lastTreeNode = null;
    if (treePath != null){
    lastTreeNode = (DefaultMutableTreeNode)(treePath.getLastPathComponent());
    }
    if (lastTreeNode != null){
         lastNode = getNode(lastTreeNode); }
    if (lastNode != null){
    mBaseModel.setNode(lastNode);
    if (mBaseModel.isItemChanged()){
    nodeAttrFlag = 1;
    }else{
    nodeAttrFlag = 0;
    } }         if (nodeAttrFlag ==1){
         int value = JOptionPane.showConfirmDialog(mFrame,"are you sure?","if moved",JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE);
         if (value == JOptionPane.NO_OPTION){
                setCurrentPath(mOriPathrow);
                changeFlag =1;
            }else {
             changeFlag = 0;
             }
            }
            if (changeFlag == 0){
        Node selectedNode = null;
        path = getSelectionPath();
        if (path==null) return;
        DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)path.getLastPathComponent();
        selectedNode = getNode(treeNode);
        mBaseModel.setEditNode(selectedNode);
        mBaseModel.show();
            mOriPathrow  = this.getMaxSelectionRow();
       } }
    这是我的方法,不好意思,写的比较乱。里面有一句mBaseModel.isItemChanged()方法,是这么写的(我简化了):
        public boolean isItemChanged(){
            boolean changed = true;
            if(
                (((Element)mNode).getAttribute("name")).equals((String)mNameComboBox.getSelectedItem())
                &&(((Element)mNode).getAttribute("value")).equals((String)mValueComboBox.getSelectedItem())
                ) changed = false;
            return changed;
        }其中的mNameComboBox是个普通的JComboBox,而mValueComboBox是一个设置了setEditable(true)的JComboBox,就这么点区别,导致了结果不同,用mNameComboBox完全正常,但是mValueComboBox就不正常了