java swing jtree 什么是树的数据模型
可以参考 javax.swing.tree 的思想 给你一点点的提示...
import java.util.*;
/** 树对象 */
public interface Tree implements Iterable{
/** 得到树根 */
TreeNode getRoot();
/** 返回迭代器(比如先根遍历整颗树) */
Iterator iterator();
}
//====
/** 树节点对象 */
public interface TreeNode {
/** 返回父节点 */
TreeNode getParent();
/** 返回孩子节点的迭代器 */
Iterator children();
boolean isRoot();
boolean isLeaf();
//...methods
}
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.ScrollPaneConstants;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
/**
*
* @author 逝水
*
*/
public class JTreeDemo extends JFrame implements TreeSelectionListener{
private static final long serialVersionUID = -6209666185329417356L;
//树组件
protected JTree jTree ;
public JTreeDemo(){
init();
}
//初始化
private void init() {
jTree = new JTree();
//树节点的相关数据
DefaultMutableTreeNode root = new DefaultMutableTreeNode("三国名将");
DefaultMutableTreeNode shu = new DefaultMutableTreeNode("蜀国");
DefaultMutableTreeNode wei = new DefaultMutableTreeNode("魏国");
DefaultMutableTreeNode wu = new DefaultMutableTreeNode("吴国");
shu.add(new DefaultMutableTreeNode("关羽"));
shu.add(new DefaultMutableTreeNode("张飞"));
shu.add(new DefaultMutableTreeNode("赵云"));
shu.add(new DefaultMutableTreeNode("马超"));
shu.add(new DefaultMutableTreeNode("黄忠"));
wei.add(new DefaultMutableTreeNode("张辽"));
wei.add(new DefaultMutableTreeNode("典韦"));
wei.add(new DefaultMutableTreeNode("夏侯惇"));
wei.add(new DefaultMutableTreeNode("许褚"));
wei.add(new DefaultMutableTreeNode("徐晃"));
wu.add(new DefaultMutableTreeNode("太史慈"));
wu.add(new DefaultMutableTreeNode("甘宁"));
wu.add(new DefaultMutableTreeNode("孙策"));
wu.add(new DefaultMutableTreeNode("周瑜"));
wu.add(new DefaultMutableTreeNode("陆逊"));
root.add(shu);
root.add(wei);
root.add(wu);
//树的数据模型
DefaultTreeModel model = new DefaultTreeModel(root);
//设置数据模型
jTree.setModel(model);
// 展开所有树
for (int i = 0; i < jTree.getRowCount(); i++)
jTree.expandRow(i);
//添加事件
jTree.addTreeSelectionListener(this);
//滚动面板
JScrollPane jScrollPane = new JScrollPane(jTree,
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
//添加树到滚动面板
jScrollPane.getViewport().add(jTree);
//添加滚动面板到窗口中
this.getContentPane().add(jScrollPane);
this.setTitle("JTree的事件例子");
this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args){
//Windows风格
//String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
//Windows Classic风格
//String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel";
//系统当前风格
String lookAndFeel = UIManager.getSystemLookAndFeelClassName();
try {
UIManager.setLookAndFeel(lookAndFeel);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
JTreeDemo demo = new JTreeDemo();
demo.setVisible(true);
}
@Override
public void valueChanged(TreeSelectionEvent e) {
//获取选择的节点
DefaultMutableTreeNode node = (DefaultMutableTreeNode) jTree
.getLastSelectedPathComponent();
if(node.getLevel() == 0){
//显示提示信息
JOptionPane.showMessageDialog(null,
node.getUserObject()+": 共"+node.getChildCount()+"个国家");
}else if(node.getLevel() == 1){
//显示提示信息
JOptionPane.showMessageDialog(null,
node.getUserObject()+": 共"+node.getChildCount()+"名名将");
}else if(node.getLevel() == 2){
//显示提示信息
JOptionPane.showMessageDialog(null, node.getParent()+"名将: "+
node.getUserObject());
}
}
}
除父节点和子节点外,树的节点还有一个用户对象(当使用DefaultTreeModel时就会呈现一个用户对象)。用户对象是Object类型,因此它提供了一个将任意对象与节点相关联的办法。
树有一个简单的模型,每一个JTree实例都要维护对绘制器和编辑器的引用,这个绘制器和编辑器被树中所有的节点所使用。表1中列出了swing.tree包中的主要类。
1.构建树
DefaultMutableTreeNode root = new DefaultMutableTreeNode("World");//为了构建一个默认的树模型,必须提供一个根节点
DefaultMutableTreeNode country = new DefaultMutableTreeNode("USA");
root.add(country);
...
DefaultTreeModel treeModel = new DefaultTreeModel(root);//用根节点构建一个DefaultTreeModel树模型
JTree tree = new JTree(treeModel);//用这个树模型构建一个JTree树
或者,直接将根节点传递给JTree构造器,那么这课树会自动构建一个默认的树模型:
JTree tree = new JTree(root);
Container contentPane = getContentPane();
contentPane.add(new JScrollPane(tree));