Java SE 6 开发时遇到的问题 -- JTree在监听节点切换时要注意的问题

引言

Java 里关于树形控件的操作好复杂啊,但是感觉灵活性挺大的,今天遇到一个问题,即当所选节点切换时使用JTree的getLastSelectedComponent()没有作用,很奇怪,Sun给的例子说是可以正常,用Java Starting在线看效果也没有问题,但是到我这儿就有问题,估计是Sun用的是以前的例子吧,不过好在我找到了解决方法,而且感觉这个方法更好,跟大家分享一下~

涉及的知识

1.相关的import

import  javax.swing.JTree;
import  javax.swing.event.TreeSelectionEvent;
import  javax.swing.event.TreeSelectionListener;
import  javax.swing.tree.DefaultMutableTreeNode;
import  javax.swing.tree.TreeSelectionModel;

2.JTree的构造方法

//  先生成一个节点做为根节点
DefaultMutableTreeNode root  =   new  DefaultMutableTreeNode( " Outlooks " );
//  省掉后面生成子节点的过程,用root.add(Object)就可以了

3.要有一些属性设置

 

//  当子节点都被插入root后,生成控件
treeOutlook  =   new  JTree(root);
//  设置同时只能有一个节点被选中,这是为了确定唯一路径,这样才能激发valueChange事件
treeOutlook.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
//  因为当前类已经实现了TreeSelectionListener接口,所以将自己配置成树的相应监听器就可以了
treeOutlook.addTreeSelectionListener( this );
// 特别注意的,这三步是必不可少的

4.要处理节点焦点的切换事件(Java里称之为valueChange)需要实现接口TreeSelectionListener

public   class  MainFrame  extends  JFrame 
    
implements  TreeSelectionListener  {
    
// 省掉了无关代码
    
// 这里实现TreeSelectionListener的valueChange函数来响应节点焦点的切换事件
    public void valueChanged(TreeSelectionEvent evt) {
        
// 这是我得到当前节点的方法
        DefaultMutableTreeNode node = 
            (DefaultMutableTreeNode)evt.getNewLeadSelectionPath().getLastPathComponent();
        
// 这是官网上实现的方法 treeOutlook是我定义的JTree实例
        
// DefaultMutableTreeNode node = (DefaultMutableTreeNode)treeOutlook.getLastSelectedPathComponent();
        if (node == null{
            
return;
        }

        
if (node.isLeaf()) {
            OutlookMap map 
= (OutlookMap)node.getUserObject();
            mapBox.loadMap(map.getImageFileName());
            mapBox.initConfig(map.getConfigurationFileName());
        }

    }

}

5.补充

用官网上的方法我是没有得到节点,node一直是null,我也建议大家尽量使用事件提供的参数来获得想要的对象,主要是因为这样比较直接~更多的还在研究当中~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值