11package sample ;
22
33import javafx .application .Platform ;
4+ import javafx .beans .property .ReadOnlyStringWrapper ;
45import javafx .event .ActionEvent ;
56import javafx .fxml .FXML ;
67import javafx .fxml .Initializable ;
7- import javafx .scene .control .Button ;
8- import javafx .scene .control .TextField ;
9- import javafx .scene .control .TreeItem ;
10- import javafx .scene .control .TreeView ;
8+ import javafx .scene .control .*;
119import javafx .stage .DirectoryChooser ;
1210import javafx .stage .Window ;
11+ import sample .domain .FileTreeItem ;
1312
1413import java .io .File ;
1514import java .io .IOException ;
@@ -36,23 +35,26 @@ public class Controller implements Initializable {
3635 public TextField ignoreFileSize ;
3736
3837 @ FXML
39- private TreeView <String > myTreeView ;
38+ private TreeTableView <FileTreeItem > myTreeTableView ;
39+
40+ TreeTableColumn <FileTreeItem , String > fileNameColumn ;
41+ TreeTableColumn <FileTreeItem , String > fileSizeColumn ;
4042 private Window stage ;
4143
4244
4345 @ Override
4446 public void initialize (URL location , ResourceBundle resources ) {
4547 // TODO (don't really need to do anything here).
46- }
47-
48- /**
49- * 生成目录文件树;包含文件、目录大小
50- *
51- * @param path 路径
52- * @return TreeItem<String>
53- */
54- private TreeItem < String > initTreeView ( String path ) {
55- return initTreeView ( path , 0 );
48+ System . out . println ( "初始化文件树窗口" );
49+ fileNameColumn = new TreeTableColumn <>( "文件名" );
50+ fileNameColumn . setPrefWidth ( 530 );
51+ fileNameColumn . setCellValueFactory (( TreeTableColumn . CellDataFeatures < FileTreeItem , String > param )
52+ -> new ReadOnlyStringWrapper ( param . getValue (). getValue (). getName ()));
53+ fileSizeColumn = new TreeTableColumn <>( "文件大小" );
54+ fileSizeColumn . setPrefWidth ( 100 );
55+ fileSizeColumn . setCellValueFactory (( TreeTableColumn . CellDataFeatures < FileTreeItem , String > param )
56+ -> new ReadOnlyStringWrapper ( param . getValue (). getValue (). getSize ()));
57+ myTreeTableView . getColumns (). setAll ( fileNameColumn , fileSizeColumn );
5658 }
5759
5860 /**
@@ -62,27 +64,17 @@ private TreeItem<String> initTreeView(String path) {
6264 * @param size 过滤小于size字节的文件
6365 * @return TreeItem<String>
6466 */
65- private TreeItem <String > initTreeView (String path , long size ) {
66-
67+ private TreeItem <FileTreeItem > initTreeView (String path , long size ) {
6768 long size0 ;
6869 File file = new File (path );
6970 size0 = getDirSize (file );
70- TreeItem <String > item = new TreeItem <>(file .getName () + " \t " + sizeFormat (size0 ));
71+ TreeItem <FileTreeItem > item = new TreeItem <>(new FileTreeItem ( file .getName (), sizeFormat (size0 ) ));
7172 item .setExpanded (false );
7273 if (file .exists ()) {
7374 File [] files = file .listFiles ();
7475 if (files != null && files .length != 0 ) {
75- //对文件和文件夹按名称进行排序
76- Arrays .sort (files , (o1 , o2 ) -> {
77- //将文件夹与文件分开排序
78- if (o1 .isDirectory () && o2 .isFile ())
79- return -1 ;
80- else if (o2 .isDirectory () && o1 .isFile ())
81- return 1 ;
82- //对字符串大写处理,使返回的拼音为小写、英文为大写,从而将英文和中文分开排序。
83- return GetPinYin .getPinYin (o1 .getName ().toUpperCase ()).compareTo (GetPinYin .getPinYin (o2 .getName ().toUpperCase ()));
84- });
85-
76+ // 对文件和文件夹按名称进行排序
77+ sortFiles (files );
8678 for (File file2 : files ) {
8779 if (file2 .isDirectory ()) {
8880 size0 = getDirSize (file2 );
@@ -92,7 +84,7 @@ else if (o2.isDirectory() && o1.isFile())
9284 } else {
9385 size0 = file2 .length ();
9486 if (size == 0 || size0 > size ) {
95- TreeItem <String > i2 = new TreeItem <>(file2 .getName () + " \t " + sizeFormat (size0 ));
87+ TreeItem <FileTreeItem > i2 = new TreeItem <>(new FileTreeItem ( file2 .getName (), sizeFormat (size0 ) ));
9688 item .getChildren ().add (i2 );
9789 }
9890 }
@@ -105,38 +97,50 @@ else if (o2.isDirectory() && o1.isFile())
10597 return item ;
10698 }
10799
108- //"生成文件树"按钮
100+ /**
101+ * "生成文件树"按钮
102+ *
103+ * @param event
104+ */
109105 public void getDir (ActionEvent event ) {
110- //多线程
111106 new Thread (() -> {
112107 String path = myText .getText ();
113-
114108 Platform .runLater (() -> myButton .setText ("生成中..." ));
115109 System .out .println (path );
116110 long size = Long .parseLong (ignoreFileSize .getText ());
117- TreeItem <String > item = initTreeView (path , size * 1024 );
111+ TreeItem <FileTreeItem > item = initTreeView (path , size * 1024 );
118112 item .setExpanded (true );
119- //等到Application Thread空闲的时候,Platform.runLater就会自动执行队列中修改界面的工作了
113+
114+ // 等到Application Thread空闲的时候,Platform.runLater就会自动执行队列中修改界面的工作了
120115 Platform .runLater (() -> {
121- myTreeView .setRoot (item );
116+ myTreeTableView .setRoot (item );
117+ myTreeTableView .getColumns ().setAll (fileNameColumn , fileSizeColumn );
122118 myButton .setText ("生成文件树" );
123119 });
124120 }).start ();
125121 }
126122
127- //"选择目录"按钮:获得想要制作文件树的路径
123+ /**
124+ * "选择目录"按钮:获得想要制作文件树的路径
125+ *
126+ * @param event
127+ */
128128 public void openDir (ActionEvent event ) {
129129 DirectoryChooser directoryChooser = new DirectoryChooser ();
130130 File file = directoryChooser .showDialog (null );
131- if (file != null )
131+ if (file != null ) {
132132 myText .setText (file .getPath ());
133+ }
133134 }
134135
135136
136- //"保存文件树"按钮:将层级目录保存到本地
137+ /**
138+ * "保存文件树"按钮:将层级目录保存到本地
139+ *
140+ * @param event
141+ */
137142 public void saveDir (ActionEvent event ) {
138- //多线程
139- new Thread (() ->{
143+ new Thread (() -> {
140144 Platform .runLater (() -> saveDir .setText ("生成中..." ));
141145 String path = myText .getText ();
142146 long size = Long .parseLong (ignoreFileSize .getText ());
0 commit comments