引言
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;
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)就可以了
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 );
// 特别注意的,这三步是必不可少的
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());
}
}
}
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,我也建议大家尽量使用事件提供的参数来获得想要的对象,主要是因为这样比较直接~更多的还在研究当中~