JTree刷新处理(特殊需求)

        这两天被这个JTree着实刁难了一番。原因是我的不同寻常的需求给自己带来了很多麻烦, 本文不讨论其他,只研究一下处理这种需求的方法。下面是创建树的CODE。

public   void  createTree(String[] string) {
        JTree stepTree;
        DefaultMutableTreeNode fatherNode 
= null;                                //定义父节点
        DefaultMutableTreeNode childNode = null;                                 //定义子节点
        
        fatherNode 
= new DefaultMutableTreeNode(treeStr[0]);            //添加父节点
        
        
for(int i=1;i<treeStr.length;i++){        
            childNode 
= new DefaultMutableTreeNode(treeStr[i]);           //创建子节点
            fatherNode.add(childNode);                                                        //添加子节点到父结点上
        }
        
        
        stepTree 
= new JTree(fatherNode);                                               //创建一个树                    
        stepTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);    //设置同一个时间选择一个节点
        stepTree.setRowHeight(20);        
        stepTree.addTreeSelectionListener(
this);                                   //添加监听器
        stepTree.setBorder(BorderFactory.createEmptyBorder(0,0,0,3));        //设置树结点的位置
        
    }

        有点眼熟吧,这段代码参考了SUN的教程,哈哈~~,注意,我没有用“DefaultTreeModel”类来做,所以请注意区别。

        下面说一下我的需求,我有两个DIalog窗口(JDialog),每个窗口里都有一个JPanel(两个窗口使用的是同一个JPanel的不同的实例),这个JPanel中就存有上面这棵树,为了使这两个独立窗口的树操作起来像是在使用一棵树,就要人为的给树的节点作标记,但是在监听的时候就会遇到一些问题。如果使用stepTree.setSelectionRow(int i)这个方法来作标记,在显示的时候会出现关闭窗口后又弹出一次窗口的情况。

        举例说明:我在窗口A中的树上选择了窗口B,期间我使用了上述标记方法,使得B中指定的树节点高亮显示,当我关闭B窗口的时候,系统又会弹出一个B窗口,这个窗口高亮的树节点是指向A的那个。

        现在要解决的问题就是如何不让第二个窗口弹出来。我试验了很多方法,其中典型的有把JPanel和JTree分别设置成静态的,供两个窗口使用,但是,当使用A.show()或者B.show()的弹出新窗口的时候,静态的实例竟然无法显示了,无奈中,只能选择从树本身下手。

        我仔细的对代码进行了跟踪,发现只要使用stepTree.setSelectionRow(int i),都会触发监听器,能不能在作标记之前先关闭监听呢,标记之后再加载监听器就可以了嘛。经过一番尝试,果然成功了。下面就是这段代码,感兴趣的朋友看看吧。

/**
     * 树监听器
     * 
@param TreeSelectionEvent e
     
*/

    
public   void  valueChanged(TreeSelectionEvent e)  {
        String strSelectedPath = e.getPath().getLastPathComponent().toString();
        
for(int i = 0 ; i < treeStr.length ; i++){
            
if(owner != null && strSelectedPath != null){
                
if(strSelectedPath.equals(treeStr[i])){
                    
//关闭当前窗口
                    oldui.dispose();
                    
//获取指定窗口所有的Tree
                    JTree tree = panel.stepTree;
                    
/*
                      由于直接执行tree.setSelectionRow(i);
                      会触发valueChange的监听,
                      需要先关闭指定窗口的监听,再执行选择行的代码
                      ,最后再启动监听,ui为新窗口的实例
                    
*/

                    tree.removeTreeSelectionListener(ui);
                    tree.setSelectionRow(i);
                    tree.addTreeSelectionListener(ui);
                    //弹出新窗口
                    ui.show();
                    
return;
                }

            }

        }

        
    }

 PS:本人由于某些原因不得不面对这种需求,希望大家以后不要碰到这种问题哈。 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值