📄 s20.htm
字号:
<p> </p> <p align="center"><b>例 20-4 JTree文件查看器</b></p> <hr size="1" noshade> import javax.swing.*;<br> import javax.swing.event.*;<br> import javax.swing.tree.*;<br> import java.awt.*;<br> import java.awt.event.*;<br> import java.io.File;<br> import java.util.EventObject;<p> public class Test extends JFrame {<br> public Test() {<br> final JTree tree = new JTree(createTreeModel());<br> JScrollPane scrollPane = new JScrollPane(tree);</p> <p> getContentPane().add(scrollPane, BorderLayout.CENTER);<br> getContentPane().add(GJApp.getStatusArea(), <br> BorderLayout.SOUTH);</p> <p> tree.addTreeExpansionListener(new TreeExpansionListener(){<br> public void treeCollapsed(TreeExpansionEvent e) {<br> }<br> public void treeExpanded(TreeExpansionEvent e) {<br> UpdateStatus updateThread;<br> TreePath path = e.getPath();<br> FileNode node = (FileNode)<br> path.getLastPathComponent();</p> <p> if( ! node.isExplored()) {<br> DefaultTreeModel model = (DefaultTreeModel)tree.getModel();<br> GJApp.updateStatus("exploring ...");</p> <p> UpdateStatus us = new UpdateStatus();<br> us.start();</p> <p> node.explore();<br> model.nodeStructureChanged(node);<br> }<br> }<br> class UpdateStatus extends Thread {<br> public void run() {<br> try { Thread.currentThread().sleep(450); }<br> catch(InterruptedException e) { }</p> <p> SwingUtilities.invokeLater(new Runnable() {<br> public void run() {<br> GJApp.updateStatus(" ");<br> }<br> });<br> }<br> }<br> });<br> }<br> private DefaultTreeModel createTreeModel() {<br> File root = new File("E:/");<br> FileNode rootNode = new FileNode(root);</p> <p> rootNode.explore();<br> return new DefaultTreeModel(rootNode);<br> }<br> public static void main(String args[]) {<br> GJApp.launch(new Test(),"JTree File Explorer",<br> 300,300,450,400);<br> }<br> }<br> class FileNode extends DefaultMutableTreeNode {<br> private boolean explored = false;</p> <p> public FileNode(File file) { <br> setUserObject(file); <br> }<br> public boolean getAllowsChildren() { return isDirectory(); }<br> public boolean isLeaf() { return !isDirectory(); }<br> public File getFile() { return (File)getUserObject(); }</p> <p> public boolean isExplored() { return explored; }</p> <p> public boolean isDirectory() {<br> File file = getFile();<br> return file.isDirectory();<br> }<br> public String toString() {<br> File file = (File)getUserObject();<br> String filename = file.toString();<br> int index = filename.lastIndexOf(File.separator);</p> <p> return (index != -1 && index != filename.length()-1) ? <br> filename.substring(index+1) : <br> filename;<br> }<br> public void explore() {<br> if(!isDirectory())<br> return;</p> <p> if(!isExplored()) {<br> File file = getFile();<br> File[] children = file.listFiles();</p> <p> for(int i=0; i < children.length; ++i) <br> add(new FileNode(children[i]));</p> <p> explored = true;<br> }<br> }<br> }<br> class GJApp extends WindowAdapter {<br> static private JPanel statusArea = new JPanel();<br> static private JLabel status = new JLabel(" ");</p> <p> public static void launch(final JFrame f, String title,<br> final int x, final int y, <br> final int w, int h) {<br> f.setTitle(title);<br> f.setBounds(x,y,w,h);<br> f.setVisible(true);</p> <p> statusArea.setBorder(BorderFactory.createEtchedBorder());<br> statusArea.setLayout(new FlowLayout(FlowLayout.LEFT,0,0));<br> statusArea.add(status);<br> status.setHorizontalAlignment(JLabel.LEFT);</p> <p> f.setDefaultCloseOperation(<br> WindowConstants.DISPOSE_ON_CLOSE);</p> <p> f.addWindowListener(new WindowAdapter() {<br> public void windowClosed(WindowEvent e) {<br> System.exit(0);<br> }<br> });<br> }<br> static public JPanel getStatusArea() {<br> return statusArea;<br> }<br> static public void updateStatus(String s) {<br> status.setText(s);<br> }<br> }</p> <hr size="1" noshade> <p>20.3 树路径</p> <p align="center"><b>例20-5 使用树路径</b></p> <hr size="1" noshade> import javax.swing.*;<br> import javax.swing.event.*;<br> import javax.swing.tree.*;<br> import java.awt.*;<br> //import java.awt.event.*; <p>public class Test extends JApplet {<br> JTree tree = new JTree();<br> DefaultTreeModel model = (DefaultTreeModel)tree.getModel();<br> TreeSelectionModel selectionModel = tree.getSelectionModel();</p> <p> public void init() {<br> getContentPane().add(tree, BorderLayout.CENTER);</p> <p> tree.addTreeSelectionListener(<br> new TreeSelectionListener() {<br> public void valueChanged(TreeSelectionEvent e) {<br> TreePath path = e.getNewLeadSelectionPath();</p> <p> if(path == null)<br> System.out.println("Selection Cleared");<br> else {<br> TreePath parentPath = path.getParentPath();<br> Object <br> lastNode = path.getLastPathComponent(),<br> firstNode= path.getPathComponent(0);</p> <p> System.out.println("Path: " + path + <br> " has " + <br> path.getPathCount() + <br> " nodes");<br> System.out.println("Last Path Component: " +<br> lastNode.toString());<br> System.out.println("First Path Component: " +<br> firstNode.toString());<br> System.out.println("Parent Path: " + <br> parentPath);</p> <p> // the following if statement is always true </p> <p> if(parentPath.isDescendant(path)) {<br> System.out.println(parentPath + <br> " is a descendant of " + path);</p> <p> }<br> DefaultMutableTreeNode last =<br> (DefaultMutableTreeNode)lastNode;<br> DefaultMutableTreeNode first =<br> (DefaultMutableTreeNode)lastNode;</p> <p> if(first.isNodeDescendant(last)) {<br> System.out.println(<br> "last is descendant of first");<br> <br> }<br> System.out.println("");<br> }</p> <p> }<br> });<br> }<br> }</p> <hr size="1" noshade> <p> 20.4 树模型</p> <p> </p> <p align="center"><b>例20-6 添加和删除节点</b></p> <hr size="1" noshade> import javax.swing.*;<br> import javax.swing.event.*;<br> import javax.swing.tree.*;<br> import java.awt.*;<br> import java.awt.event.*; <p>public class Test extends JFrame {<br> JTree tree = new JTree();<br> DefaultTreeModel model = (DefaultTreeModel)tree.getModel();<br> TreeSelectionModel selectionModel = tree.getSelectionModel();</p> <p> JButton removeButton = new JButton("Remove selected node");<br> JButton addButton = new JButton("Add node");</p> <p> public Test() {<br> Container contentPane = getContentPane();</p> <p> selectionModel.setSelectionMode(<br> TreeSelectionModel.SINGLE_TREE_SELECTION);</p> <p> contentPane.add(new ControlPanel(), BorderLayout.NORTH);<br> contentPane.add(tree, BorderLayout.CENTER);</p> <p> tree.addTreeSelectionListener(<br> new TreeSelectionListener() {<br> public void valueChanged(TreeSelectionEvent e) {<br> TreePath path = e.getNewLeadSelectionPath();<br> boolean nodesAreSelected = (path != null);</p> <p> addButton.setEnabled(nodesAreSelected);<br> removeButton.setEnabled(nodesAreSelected);<br> }<br> });<br> model.addTreeModelListener(new TreeModelListener() {<br> public void treeNodesInserted(TreeModelEvent e) {<br> showInsertionOrRemoval(e, " added to ");<br> }<br> public void treeNodesRemoved(TreeModelEvent e) {<br> showInsertionOrRemoval(e, " removed from ");<br> }<br> private void showInsertionOrRemoval(TreeModelEvent e,<br> String s) {<br> Object[] parentPath = e.getPath();<br> int[] indexes = e.getChildIndices();<br> Object[] children = e.getChildren();<br> Object parent = parentPath[parentPath.length-1];</p> <p> JOptionPane.showMessageDialog(Test.this,<br> "Node \"" + children[0].toString() + <br> "\"" + s + parent.toString() + <br> " at index " + indexes[0],<br> "Node Added or Removed",<br> JOptionPane.INFORMATION_MESSAGE);<br> }<br> public void treeNodesChanged(TreeModelEvent e) {}<br> public void treeStructureChanged(TreeModelEvent e) {}<br> });<br> }<br> class ControlPanel extends JPanel {<br> public ControlPanel() {<br> addButton.setEnabled(false);<br> removeButton.setEnabled(false);</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -