【Swing入門教程】一步一步做Netbeans(4):JTree的使用及定製TreeCellRenderer

來源:互聯網
上載者:User

      下一步我們要做什麼呢,其實我是想早點睡覺;我一直有個願望,希望能在12點之前睡覺,每次都被我硬生生的拖到12點以後,我一直認為12點之前睡覺是浪費時間,會有一種負罪感。那都是學生時代養成的習慣,那時晚睡沒關係,第二天可以補回來。然而,工作了覺是補不回來的。

      JTree是Swing裡一個很重要的組件,要詳細講的話起碼要N個教程。我這就偷工減料,況且我對JTree的理解也只是入門階段,還是不誤人子弟的好。接下來我們要實現Netbeans中項目的檔案樹列表,這個非JTree莫選了。按慣例,先看下效果:

      有幾點做的不好:

      1:根節點還在。或許你說用setRootVisible(false)不就行了。這樣雖然根節點看不見了,但是下面主節點前的小加號都沒了,這個暫時還不知道怎麼解決,希望各位給點意見。

      2:順序有點亂,和Netbeans中的順序不一樣。我是採用JTree的預設排序,它是按字母排序的;而Netbeans的規律是檔案夾在前,檔案在後。

      3:節點的表徵圖和檔案名稱的距離過近。這個就是表徵圖的問題了,Netbeans表徵圖的右邊肯定留了一些空白,他有兩套表徵圖,另一套是給有版本控制用的(右邊多了個小標誌)。

      廢話不多說了,上代碼;先在"檔案"面板上放入JTree,通過initTree()來初始化:

leftTabbedPane.add("項目",new JPanel());<br /> leftTabbedPane.add("檔案", new JScrollPane(initTree()));<br /> leftTabbedPane.add("服務",new JPanel());<br /> leftTabbedPane.add("團隊開發",new JPanel());<br /> leftPanel.add(leftTabbedPane);<br /> leftSplitPane.setLeftComponent(leftPanel);

      initTree()中重要的是如何通過檔案夾來初始化JTree的節點,裡面用到的一個遞迴函式;在學校時遞迴函式沒理解好,還在裡面繞了一小會:

/** 初始化JTree */<br /> private JTree initTree(){<br /> DefaultMutableTreeNode top = new DefaultMutableTreeNode(null);<br /> File dir=new File("C:/Users/monitor/Documents/NetBeansProjects/");<br /> addDir(top,dir);<br /> JTree tree = new JTree(top);<br /> tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);<br /> tree.setRootVisible(true);<br /> return tree;<br /> }<br /> /** 遞迴將檔案(夾)轉為JTree的節點 */<br /> private DefaultMutableTreeNode addDir(DefaultMutableTreeNode top,File file){<br /> if(file.isDirectory()){<br /> for(File f:file.listFiles()){<br /> DefaultMutableTreeNode t = new DefaultMutableTreeNode(f.getName());<br /> if(f.isDirectory())<br /> top.add(addDir(t,f));<br /> else top.add(t);<br /> }<br /> }else{<br /> top.add(new DefaultMutableTreeNode(file.getName()));<br /> }<br /> return top;<br /> }

     這樣一顆檔案樹就構造好了,只是樹節點的表徵圖都是JTree預設的表徵圖,和Netbeans的不一樣。於是不得不為JTree定製渲染器了,至少把表徵圖改一下嘛:

package com.monitor1394.netbeans.ui;<br />import java.awt.Component;<br />import javax.swing.ImageIcon;<br />import javax.swing.JTree;<br />import javax.swing.tree.DefaultMutableTreeNode;<br />import javax.swing.tree.DefaultTreeCellRenderer;<br />/**<br /> * 檔案樹渲染器<br /> *<br /> * @author monitor<br /> * Created on 2011-2-28, 0:26:57<br /> */<br />public class TreeRenderer extends DefaultTreeCellRenderer {<br /> public TreeRenderer() {<br /> }<br /> @Override<br /> public Component getTreeCellRendererComponent(JTree tree,Object value,boolean sel,<br /> boolean expanded,boolean leaf,int row,boolean hasFocus) {<br /> super.getTreeCellRendererComponent(tree, value, sel,expanded, leaf, row,hasFocus);<br /> DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;<br /> if(node.getUserObject() instanceof String){<br /> String file=(String)node.getUserObject();<br /> if(file.indexOf('.')<0){<br /> setIcon(createImageIcon("icons/dir.jpg"));<br /> }else if(file.indexOf(".java")>0){<br /> setIcon(createImageIcon("icons/java.jpg"));<br /> }else if(file.indexOf(".png")>0 || file.indexOf(".PNG")>0 || file.indexOf(".jpg")>0){<br /> setIcon(createImageIcon("icons/png.jpg"));<br /> }else if(file.indexOf(".xml")>0){<br /> setIcon(createImageIcon("icons/xml.jpg"));<br /> }else if(file.indexOf(".mf")>0){<br /> setIcon(createImageIcon("icons/mf.jpg"));<br /> }else if(file.indexOf(".jar")>0){<br /> setIcon(createImageIcon("icons/jar.jpg"));<br /> }else if(file.indexOf(".class")>0){<br /> setIcon(createImageIcon("icons/class.jpg"));<br /> }else if(file.indexOf(".properties")>0){<br /> setIcon(createImageIcon("icons/properties.jpg"));<br /> }else if(file.indexOf(".txt")>0 || file.indexOf(".TXT")>0){<br /> setIcon(createImageIcon("icons/txt.jpg"));<br /> }<br /> }<br /> return this;<br /> }<br /> protected static ImageIcon createImageIcon(String path) {<br /> java.net.URL imgURL = TreeRenderer.class.getResource(path);<br /> if (imgURL != null) {<br /> return new ImageIcon(imgURL);<br /> } else {<br /> System.err.println("Couldn't find file: " + path);<br /> return null;<br /> }<br /> }<br />}
   

       需要為JTree指定TreeCellRenderer,initTree()中的188行加入:

tree.setCellRenderer(new TreeRenderer());

搞定收工。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.