1. JList
JList本身不支持滚动条,如果要加上滚动条,就要使用JScrollPane:
JScrollPane scrollPane = new JScrollPane(wordList);
JList采用的是MVC设计,虽然可以通过数组,Vector初始化一个JList,但是这样的List内容并不能动态的改变。要想动态改变List的
内容,就必须得到它的Model:
DefaultListModel model = new DefaultListModel();
model.addElement("quick");
model.addElement("brown");
...
JList list = new JList(model);
...
model.removeElement("quick");
model.addElement("slow");
2. JTree
JTree同样也是采用MVC设计
定义节点:
DefaultMutableTreeNode root = new DefaultMutableTreeNode("World");
DefaultMutableTreeNode country = new DefaultMutableTreeNode("USA");
root.add(country);
DefaultMutableTreeNode state = new DefaultMutableTreeNode("California");
country.add(state);
把节点与Model联系起来:
DefaultTreeModel treeModel = new DefaultTreeModel(root);
定义树:
JTree tree = new JTree(treeModel);
几个和树的显示相关的方法
tree.setShowsRootHandles(true);
tree.setRootVisible(false);
通常情况下,叶结点和非叶结点显示的图标是不一样的,如果想要显示一样的图标:
JTree tree = new JTree(root, true);
对于想显示为叶结点图标的节点:
node.setAllowsChildren(false);
得到一个选中的节点:
TreePath selectionPath = tree.getSelectionPath();
DefaultMutableTreeNode selectedNode
= (DefaultMutableTreeNode) selectionPath.getLastPathComponent();
或是简化为:
DefaultMutableTreeNode selectedNode
= (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
加入新节点:
model.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount());
删除节点:
model.removeNodeFromParent(selectedNode);
修改一个节点:
model.nodeChanged(changedNode);
当加入一个节点的时候,他的父节点有可能没有展开,这样会给用户带来迷惑:
TreeNode[] nodes = model.getPathToRoot(newNode);
TreePath path = new TreePath(nodes);
tree.makeVisible(path);
但是如果tree是加入到了一个ScrollPane里,就应该调用:
tree.scrollPathToVisible(path);
使节点可以编辑:
tree.setEditable(true);
遍历所有节点:
Enumeration breadthFirst = node.breadthFirstEnumeration();
或depthFirstEnumeration()
自定义节点显示:
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
renderer.setLeafIcon(new ImageIcon("blue-ball.gif")); // used for leaf nodes
renderer.setClosedIcon(new ImageIcon("red-ball.gif")); // used for collapsed nodes
renderer.setOpenIcon(new ImageIcon("yellow-ball.gif")); // used for expanded nodes
tree.setCellRenderer(renderer);