學習Java的Swing的時候寫的一個超簡單文件瀏覽器java
效果如圖:瀏覽器
項目結構:ide
這裏面主要用了兩個控件,JTree和JTable學習
下面先說下左側的文件樹如何實現:this
首先是FileTree類,繼承於JTree類,這裏實現了樹節點展開,和鼠標移動事件響應spa
package FileTree; import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; import javax.swing.JTree; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeWillExpandListener; import javax.swing.filechooser.FileSystemView; import javax.swing.tree.ExpandVetoException; import javax.swing.tree.TreePath; /** * Created by Administrator on 2016/3/29. */ public class FileTree extends JTree { private static final long serialVersionUID = 1L; public TreePath mouseInPath; static protected FileSystemView fileSystemView = FileSystemView.getFileSystemView(); public FileTree() { setRootVisible(false); addTreeWillExpandListener(new TreeWillExpandListener(){ @Override public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException { FileTreeNode fileNode = (FileTreeNode)event.getPath().getLastPathComponent(); if (!fileNode.isInit()){ File[] files; if(fileNode.isDummyRoot()) { files = fileSystemView.getRoots(); } else { files = fileSystemView.getFiles(fileNode.getFile(), false); } for (int i = 0; i < files.length; i++){ if (files[i].isDirectory()) { FileTreeNode childFileNode = new FileTreeNode(files[i]); fileNode.add(childFileNode); } } } fileNode.setInit(true); } @Override public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException { } }); addMouseMotionListener(new MouseAdapter() { @Override public void mouseMoved(MouseEvent e) { TreePath path = getPathForLocation(e.getX(), e.getY()); if (path != null) { if (mouseInPath != null) { Rectangle oldRect = getPathBounds(mouseInPath); mouseInPath = path; repaint(getPathBounds(path).union(oldRect)); } else { mouseInPath = path; } } else if (mouseInPath != null) { Rectangle oldRect =getPathBounds(mouseInPath); mouseInPath = null; repaint(oldRect); } } }); } }
FileTreeCellRenderer繼承自DefaultTreeCellRenderer, 負責樹節點顯示渲染,這裏主要是須要重載getTreeCellRendererComponent()方法code
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)繼承
解釋:配置基於傳入組件的渲染器。使用 convertValueToText
向樹傳遞消息,從而設置該值,最終對 value
調用 toString
。基於選擇設置前景色,基於 leaf
和 expanded
參數設置圖標。事件
返回:渲染器用來繪製值的 Component
get
package FileTree; import java.awt.Color; import java.awt.Component; import java.io.File; import javax.swing.JLabel; import javax.swing.JTree; import javax.swing.plaf.ColorUIResource; import javax.swing.tree.DefaultTreeCellRenderer; /** * Created by Administrator on 2016/3/29. */ public class FileTreeCellRenderer extends DefaultTreeCellRenderer { private static final long serialVersionUID = 1L; public FileTreeCellRenderer(){ } @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { FileTree fileTree = (FileTree) tree; FileTreeNode fileNode = (FileTreeNode) value; File file = (File) fileNode.getUserObject(); JLabel label = (JLabel)super.getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus); label.setText(fileNode.getFileName()); label.setIcon(fileNode.getFileIcon()); label.setOpaque(false); if (fileTree.mouseInPath != null && fileTree.mouseInPath.getLastPathComponent().equals(value)) { label.setOpaque(true); // label.setBackground(new Color(255, 0, 0, 90)); label.setBackground(Color.gray); } return label; } @Override public void setBackground(Color bg) { if (bg instanceof ColorUIResource){ bg = null; } super.setBackground(bg); } }
FileTreeNode繼承DefaultMutableTreeNode類, 用於保存文件名和其餘文件相關屬性
package FileTree; import java.io.File; import javax.swing.Icon; import javax.swing.filechooser.FileSystemView; import javax.swing.tree.DefaultMutableTreeNode; /** * Created by Administrator on 2016/3/29. */ public class FileTreeNode extends DefaultMutableTreeNode { private static final long serialVersionUID = 1L; static FileSystemView fileSystemView = FileSystemView.getFileSystemView(); private boolean isInit; private boolean isDummyRoot; private String fileName; private Icon fileIcon; public File getFile() { return file; } private File file; public FileTreeNode(File file){ this(file, false, true); } public FileTreeNode(File file, boolean isDummyRoot){ this(file,isDummyRoot, true); } public FileTreeNode(File file, boolean isDummyRoot, boolean allowsChildren){ super(file, allowsChildren); this.file = file; this.fileName = fileSystemView.getSystemDisplayName(file); this.fileIcon = fileSystemView.getSystemIcon(file); this.isDummyRoot = isDummyRoot; } public boolean isInit() { return isInit; } public void setInit(boolean init) { isInit = init; } public boolean isDummyRoot() { return isDummyRoot; } public void setDummyRoot(boolean dummyRoot) { isDummyRoot = dummyRoot; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public Icon getFileIcon() { return fileIcon; } public void setFileIcon(Icon fileIcon) { this.fileIcon = fileIcon; } }
本文連接: http://www.bugcoding.com/entry/15
版權全部。轉載時必須以連接形式註明做者和原始出處及本聲明。