Java by API/javax.swing.tree/DefaultTreeModel — различия между версиями
Admin (обсуждение | вклад) м (1 версия) |
|
(нет различий)
|
Версия 20:43, 31 мая 2010
Содержание
DefaultTreeModel: addTreeModelListener(TreeModelListener l)
<source lang="java">
import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; class MyTreeModelListener implements TreeModelListener {
public void treeNodesChanged(TreeModelEvent e) { DefaultMutableTreeNode node; node = (DefaultMutableTreeNode) (e.getTreePath().getLastPathComponent()); try { int index = e.getChildIndices()[0]; node = (DefaultMutableTreeNode) (node.getChildAt(index)); } catch (NullPointerException exc) { } System.out.println("New value: " + node.getUserObject()); } public void treeNodesInserted(TreeModelEvent e) { System.out.println(e); } public void treeNodesRemoved(TreeModelEvent e) { System.out.println(e); } public void treeStructureChanged(TreeModelEvent e) { System.out.println(e); }
} public class Main {
public static void main(String args[]) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); JTree tree = new JTree(root); DefaultTreeModel treeModel = new DefaultTreeModel(root); treeModel.addTreeModelListener(new MyTreeModelListener()); treeModel.insertNodeInto(new DefaultMutableTreeNode("A") ,root,0); root.add(new DefaultMutableTreeNode("B")); root.add(new DefaultMutableTreeNode("C")); JScrollPane scrollPane = new JScrollPane(tree); frame.add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 150); frame.setVisible(true); }
}
</source>
DefaultTreeModel: insertNodeInto(MutableTreeNode n, MutableTreeNode p, int i)
<source lang="java">
import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreePath; public class MainClass extends JPanel {
public static void main(String[] args) { // create a hierarchy of nodes MutableTreeNode root = new DefaultMutableTreeNode("A"); MutableTreeNode bNode = new DefaultMutableTreeNode("B"); MutableTreeNode cNode = new DefaultMutableTreeNode("C"); root.insert(bNode, 0); root.insert(cNode, 1); bNode.insert(new DefaultMutableTreeNode("1"), 0); bNode.insert(new DefaultMutableTreeNode("2"), 1); cNode.insert(new DefaultMutableTreeNode("1"), 0); cNode.insert(new DefaultMutableTreeNode("2"), 1); final DefaultTreeModel model = new DefaultTreeModel(root); final JTree tree = new JTree(model); final JTextField nameField = new JTextField("Z"); final JButton button = new JButton("Add"); button.setEnabled(false); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { TreePath tp = tree.getSelectionPath(); MutableTreeNode insertNode = (MutableTreeNode) tp.getLastPathComponent(); int insertIndex = 0; if (insertNode.getParent() != null) { MutableTreeNode parent = (MutableTreeNode) insertNode.getParent(); insertIndex = parent.getIndex(insertNode) + 1; insertNode = parent; } MutableTreeNode node = new DefaultMutableTreeNode(nameField.getText()); model.insertNodeInto(node, insertNode, insertIndex); } }); JPanel addPanel = new JPanel(new GridLayout(2, 1)); addPanel.add(nameField); addPanel.add(button); tree.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { TreePath tp = e.getNewLeadSelectionPath(); button.setEnabled(tp != null); } }); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 200); frame.getContentPane().add(new JScrollPane(tree)); frame.getContentPane().add(addPanel, BorderLayout.SOUTH); frame.setVisible(true); }
}
</source>
DefaultTreeModel: reload()
<source lang="java">
import java.awt.BorderLayout; import java.util.Vector; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; public class MainClass {
public static void main(String args[]) { JFrame frame = new JFrame("Swing Package Hierarchy"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Vector rootVector = new TreeVector("A", new String[] { "a" }); JTree tree = new JTree(rootVector); tree.setRootVisible(true); TreeModel model = tree.getModel(); model.valueForPathChanged(new TreePath(model.getRoot()), "javax.swing"); ((DefaultTreeModel) model).reload(); JScrollPane scrollPane = new JScrollPane(tree); frame.getContentPane().add(scrollPane, BorderLayout.CENTER); frame.setSize(300, 300); frame.setVisible(true); }
} class TreeVector extends Vector {
String name; TreeVector(String name) { this.name = name; } TreeVector(String name, Object elements[]) { this.name = name; for (int i = 0, n = elements.length; i < n; i++) { add(elements[i]); } } public String toString() { return name; }
}
</source>
extends DefaultTreeModel (Sortable Tree Model)
<source lang="java">
import java.io.File; import java.util.ruparator; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreeNode; public class MainClass extends JFrame {
public MainClass(String startDir) { super("SortTreeModel Demonstration"); setSize(300, 400); setDefaultCloseOperation(EXIT_ON_CLOSE); MyFile f = new MyFile(startDir); DefaultMutableTreeNode root = new DefaultMutableTreeNode(f); SortTreeModel model = new SortTreeModel(root, new TreeStringComparator()); fillModel(model, root); JTree tree = new JTree(model); getContentPane().add(new JScrollPane(tree)); } protected void fillModel(SortTreeModel model, DefaultMutableTreeNode current) { MyFile pf = (MyFile) current.getUserObject(); File f = pf.getFile(); if (f.isDirectory()) { String files[] = f.list(); for (int i = 0; i < files.length; i++) { if (files[i].startsWith(".")) continue; MyFile tmp = new MyFile(pf, files[i]); DefaultMutableTreeNode node = new DefaultMutableTreeNode(tmp); model.insertNodeInto(node, current); if (tmp.getFile().isDirectory()) { fillModel(model, node); } } } } public class MyFile { File f; public MyFile(String s) { f = new File(s); } public MyFile(MyFile pf, String s) { f = new File(pf.f, s); } public File getFile() { return f; } public String toString() { return f.getName(); } } public static void main(String args[]) { MainClass demo = new MainClass("."); demo.setVisible(true); }
} class SortTreeModel extends DefaultTreeModel {
private Comparator comparator; public SortTreeModel(TreeNode node, Comparator c) { super(node); comparator = c; } public SortTreeModel(TreeNode node, boolean asksAllowsChildren, Comparator c) { super(node, asksAllowsChildren); comparator = c; } public void insertNodeInto(MutableTreeNode child, MutableTreeNode parent) { int index = findIndexFor(child, parent); super.insertNodeInto(child, parent, index); } public void insertNodeInto(MutableTreeNode child, MutableTreeNode par, int i) { // The index is useless in this model, so just ignore it. insertNodeInto(child, par); } private int findIndexFor(MutableTreeNode child, MutableTreeNode parent) { int cc = parent.getChildCount(); if (cc == 0) { return 0; } if (cc == 1) { return comparator.rupare(child, parent.getChildAt(0)) <= 0 ? 0 : 1; } return findIndexFor(child, parent, 0, cc - 1); } private int findIndexFor(MutableTreeNode child, MutableTreeNode parent, int i1, int i2) { if (i1 == i2) { return comparator.rupare(child, parent.getChildAt(i1)) <= 0 ? i1 : i1 + 1; } int half = (i1 + i2) / 2; if (comparator.rupare(child, parent.getChildAt(half)) <= 0) { return findIndexFor(child, parent, i1, half); } return findIndexFor(child, parent, half + 1, i2); }
} class TreeStringComparator implements Comparator {
public int compare(Object o1, Object o2) { if (!(o1 instanceof DefaultMutableTreeNode && o2 instanceof DefaultMutableTreeNode)) { throw new IllegalArgumentException("Can only compare DefaultMutableTreeNode objects"); } String s1 = ((DefaultMutableTreeNode) o1).getUserObject().toString(); String s2 = ((DefaultMutableTreeNode) o2).getUserObject().toString(); return s1.rupareToIgnoreCase(s2); }
}
</source>