📄 s20.htm
字号:
import java.util.*; <p>public class Test extends JApplet {<br> public void init() {<br> JTree tree = new JTree();<br> JScrollPane scrollPane = new JScrollPane(tree);<br> JComboBox combo = new JComboBox();</p> <p> combo.addItem("red");<br> combo.addItem("blue");<br> combo.addItem("green");<br> combo.addItem("orange");<br> combo.addItem("yellow");<br> combo.addItem("magenta");</p> <p> tree.setCellEditor(new DefaultTreeCellEditor(<br> tree, new DefaultTreeCellRenderer(),<br> new ColorEditor(tree, combo)));</p> <p> tree.setEditable(true);</p> <p> getContentPane().add(scrollPane);<br> }<br> }<br> class ColorEditor extends DefaultCellEditor {<br> private JTree tree;</p> <p> public ColorEditor(JTree tree, JComboBox comboBox) {<br> super(comboBox);<br> this.tree = tree;<br> }<br> public boolean isCellEditable(EventObject e) {<br> boolean rv = false; // return value</p> <p> if(e instanceof MouseEvent) {<br> MouseEvent me = (MouseEvent)e;</p> <p> if(me.getClickCount() == 3) {<br> TreePath path =<br> tree.getPathForLocation(me.getX(), me.getY()); </p> <p> if(path.getPathCount() == 1) // root node<br> return false;</p> <p> DefaultMutableTreeNode node = <br> (DefaultMutableTreeNode)<br> path.getLastPathComponent(); <br> <br> rv = node.getParent().toString().equals("colors");<br> }<br> }<br> return rv;<br> }<br> }</p> <hr size="1" noshade> <p> 20.8 绘制和编辑:学习一个样例</p> <p> </p> <p> 20.8.1 Test类</p> <p> </p> <p align="center"><b>例20-15 绘制和编辑:一个学习样例</b></p> <hr noshade size="1"> 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> JTree tree = new JTree(createTreeModel());<br> JScrollPane scrollPane = new JScrollPane(tree);</p> <p> FileNodeRenderer renderer = new FileNodeRenderer();<br> FileNodeEditor editor = new FileNodeEditor();<br> <br> tree.setEditable(true);<br> tree.setCellRenderer(renderer);<br> tree.setCellEditor(new ImmediateEditor(tree, <br> renderer, editor));</p> <p> getContentPane().add(scrollPane, BorderLayout.CENTER);</p> <p> tree.addTreeExpansionListener(new TreeExpansionListener(){<br> public void treeCollapsed(TreeExpansionEvent e) {<br> }<br> public void treeExpanded(TreeExpansionEvent e) {<br> TreePath path = e.getPath();<br> FileNode node = (FileNode)<br> path.getLastPathComponent();</p> <p> if( ! node.isExplored())<br> node.explore();<br> }<br> });<br> tree.getCellEditor().addCellEditorListener(<br> new CellEditorListener() {<br> public void editingCanceled(ChangeEvent e) {<br> CellEditor cellEditor = (CellEditor)e.getSource();<br> SelectableFile sf = <br> (SelectableFile)<br> cellEditor.getCellEditorValue();</p> <p> System.out.println("editing canceled: " + <br> sf.toString());<br> }<br> public void editingStopped(ChangeEvent e) {<br> CellEditor cellEditor = (CellEditor)e.getSource();<br> SelectableFile sf = <br> (SelectableFile)<br> cellEditor.getCellEditorValue();</p> <p> System.out.println("editing stopped: " + <br> sf.toString());<br> }<br> });<br> }<br> private DefaultTreeModel createTreeModel() {<br> File root = new File("E:/");<br> FileNode rootNode = new FileNode(root), node;</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 SelectableFile {<br> private File file;<br> private boolean selected = false;</p> <p> public SelectableFile(File file) {<br> this.file = file;<br> }<br> public String toString() {<br> return file.toString() + " selected: " + selected;<br> }<br> public void setSelected(boolean s) { selected = s; }<br> public boolean isSelected() { return selected; }<br> public File getFile() { return file; }<br> }<br> class FileNode extends DefaultMutableTreeNode {<br> private boolean explored = false;</p> <p> public FileNode(File file) { <br> setUserObject(new SelectableFile(file)); <br> }<br> public boolean getAllowsChildren() { return isDirectory(); }<br> public boolean isLeaf() { return !isDirectory(); }</p> <p> public File getFile() { <br> SelectableFile sf = (SelectableFile)getUserObject(); <br> return sf.getFile();<br> }<br> public boolean isSelected() {<br> SelectableFile sf = (SelectableFile)getUserObject(); <br> return sf.isSelected();<br> }<br> public void setSelected(boolean b) {<br> SelectableFile sf = (SelectableFile)getUserObject(); <br> sf.setSelected(b);<br> }<br> public boolean isDirectory() {<br> File file = getFile();<br> return file.isDirectory();<br> }<br> public String toString() {<br> File file = getFile();<br> String filename = file.toString();<br> int index = filename.lastIndexOf("\\");</p> <p> return (index != -1 && index != filename.length()-1) ? <br> filename.substring(index+1) : <br> filename;<br> }<br> public void explore() { explore(false); }<br> public boolean isExplored() { return explored; }</p> <p> public void explore(boolean force) {<br> if(!isExplored() || force) {<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 FileNodeRenderer extends DefaultTreeCellRenderer {<br> protected JCheckBox checkBox = new JCheckBox("backup");<br> private Component strut = Box.createHorizontalStrut(5);<br> private JPanel panel = new JPanel();</p> <p> public FileNodeRenderer() {<br> panel.setBackground(<br> UIManager.getColor("Tree.textBackground"));<br> <br> setOpaque(false);<br> checkBox.setOpaque(false);<br> panel.setOpaque(false);</p> <p> panel.setLayout(new FlowLayout(FlowLayout.CENTER,0,0));<br> panel.add(this);<br> panel.add(strut);<br> panel.add(checkBox);</p> <p> } <br> public Component getTreeCellRendererComponent(<br> JTree tree, Object value, <br> boolean selected, boolean expanded,<br> boolean leaf, int row, <br> boolean hasFocus) {<br> FileNode node = (FileNode)value;</p> <p> super.getTreeCellRendererComponent(<br> tree, value, selected, expanded,<br> leaf, row, hasFocus);</p> <p> checkBox.setVisible(node.isDirectory());<br> checkBox.setSelected(node.isSelected());</p> <p> return panel;<br> }<br> public Dimension getCheckBoxOffset() {<br> Graphics g = panel.getGraphics();<br> int xoffset = 0;</p> <p> if(g != null) {<br> try {<br> FontMetrics fm = g.getFontMetrics();<br> xoffset = fm.stringWidth(getText()) + <br> strut.getPreferredSize().width;<br> }<br> finally {<br> g.dispose();<br> }<br> }<br> return new Dimension(xoffset, 0);<br> }<br> }<br> class FileNodeEditorRenderer extends FileNodeRenderer {<br> public Component getTreeCellRendererComponent(<br> JTree tree, Object value, <br> boolean selected, boolean expanded,<br> boolean leaf, int row, <br> boolean hasFocus) {<br> Component c = super.getTreeCellRendererComponent(tree, <br> value, selected, expanded, <br> leaf, row, hasFocus);<br> setIcon(null);<br> return c;<br> }<br> public JCheckBox getCheckBox() {<br> return checkBox;<br> }<br> }<br> class FileNodeEditor extends Abs
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -