一、windows文件管理器目录树
二、代码
/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package cn.util;import imagemanagesystem.FileTreeItem;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.scene.Scene;
import javafx.scene.control.TreeView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javax.swing.filechooser.FileSystemView;/**** @author MK*/
public class Test extends Application {public static File ROOT_FILE = FileSystemView.getFileSystemView().getRoots()[0];@Overridepublic void start(Stage stage) {HBox hBox = new HBox();TreeView<String> treeView = new TreeView<>();FileTreeItem fileTreeItem = new FileTreeItem(ROOT_FILE, f -> {File[] allFiles = f.listFiles();File[] directorFiles = f.listFiles(File::isDirectory);List<File> list = new ArrayList<>(Arrays.asList(allFiles));list.removeAll(Arrays.asList(directorFiles));return list.toArray(new File[list.size()]);});treeView.setRoot(fileTreeItem);treeView.setShowRoot(false);treeView.setMinWidth(250);hBox.getChildren().add(treeView);StackPane stackPane = new StackPane();stackPane.getChildren().add(hBox);Scene scene = new Scene(stackPane, 900, 700);stage.setScene(scene);stage.show();stage.setOnCloseRequest(e -> {System.exit(0);});}public static void main(String[] args) {launch(args);}}
package imagemanagesystem;import cn.util.U;
import static cn.util.Test.ROOT_FILE;
import java.io.File;
import java.util.function.Function;
import javafx.collections.ObservableList;
import javafx.scene.control.TreeItem;/**** @author MK*/
public class FileTreeItem extends TreeItem<String> {//判断树节点是否被初始化,没有初始化为真private boolean notInitialized = true;private final File file;private final Function<File,File[]> supplier;public FileTreeItem(File file) {super(U.getFileName(file), U.getFileIconToNode(file));this.file = file;supplier = (File f) -> {if (((FileTreeItem) this.getParent()).getFile() == ROOT_FILE) {String name = U.getFileName(f);if (name.equals("网络") || name.equals("家庭组")) {return new File[0];}}return f.listFiles();};}public FileTreeItem(File file, Function<File,File[]> supplier) {super(U.getFileName(file),U.getFileIconToNode(file));this.file=file;this.supplier=supplier;}//重写getchildren方法,让节点被展开时加载子目录@Overridepublic ObservableList<TreeItem<String>> getChildren() {ObservableList<TreeItem<String>> children = super.getChildren();//没有加载子目录时,则加载子目录作为树节点的孩子if (this.notInitialized && this.isExpanded()) {this.notInitialized = false; //设置没有初始化为假/*判断树节点的文件是否是目录,*如果是目录,着把目录里面的所有的文件目录添加入树节点的孩子中。*/if (this.getFile().isDirectory()) {for (File f : supplier.apply(this.getFile())) {//如果文件是目录,则把它加到树节点上if (f.isDirectory()) {children.add(new FileTreeItem(f));}}}}return children;}//重写叶子方法,如果该文件不是目录,则返回真@Overridepublic boolean isLeaf() {return !file.isDirectory();}/*** @return the file*/public File getFile() {return file;}}
package cn.util;import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.IntBuffer;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javafx.scene.canvas.Canvas;
import javafx.scene.image.PixelFormat;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritablePixelFormat;import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.filechooser.FileSystemView;/**** @author MK*/
public class U {//设置图标public static Canvas getFileIconToNode(File file) {//获取系统文件的图标Image image = (Image) ((ImageIcon) FileSystemView.getFileSystemView().getSystemIcon(file)).getImage();//构建图片缓冲区,设定图片缓冲区的大小和背景,背景为透明BufferedImage bi = new BufferedImage(image.getWidth(null),image.getHeight(null), BufferedImage.BITMASK);bi.getGraphics().drawImage(image, 0, 0, null); //把图片画到图片缓冲区//将图片缓冲区的数据转换成int型数组int[] data = ((DataBufferInt) bi.getData().getDataBuffer()).getData();//获得写像素的格式模版WritablePixelFormat<IntBuffer> pixelFormat= PixelFormat.getIntArgbInstance();Canvas canvas = new Canvas(bi.getWidth() + 2, bi.getHeight() + 2); //新建javafx的画布//获取像素的写入器PixelWriter pixelWriter = canvas.getGraphicsContext2D().getPixelWriter();//根据写像素的格式模版把int型数组写到画布pixelWriter.setPixels(1, 1, bi.getWidth(), bi.getHeight(),pixelFormat, data, 0, bi.getWidth());//设置树节点的图标return canvas;}public static String getFileName(File file) {return FileSystemView.getFileSystemView().getSystemDisplayName(file);}}