JavaFX FileChooser文件选择器,缓存上一次打开的目录

本文介绍如何使用JavaFX的FileChooser组件来选择文件,并通过缓存文件记录上次选择的目录,以提高用户体验。文章包含两个示例,分别展示了如何设置初始目录和如何利用缓存文件保存并读取目录路径。

例1:点击按钮Choose File打开文件选择器,并打开指定的目录。这是通过final void setInitialDirectory(final File value)方法实现的。

 1 import java.io.File;
 2 
 3 import javafx.application.Application;
 4 import javafx.event.ActionEvent;
 5 import javafx.event.EventHandler;
 6 import javafx.geometry.Insets;
 7 import javafx.geometry.Pos;
 8 import javafx.scene.Scene;
 9 import javafx.scene.control.Button;
10 import javafx.scene.layout.GridPane;
11 import javafx.stage.FileChooser;
12 import javafx.stage.FileChooser.ExtensionFilter;
13 import javafx.stage.Stage;
14 
15 public class Main extends Application {
16 
17     public static void main(String[] args) {
18         launch(args);
19     }
20     
21     @Override
22     public void start(Stage primaryStage) throws Exception {
23         // Create a pane to hold a button
24         GridPane pane = new GridPane();
25         pane.setStyle("-fx-border-color: green;");
26         pane.setAlignment(Pos.CENTER);
27         pane.setPadding(new Insets(10, 10, 10, 10));
28         pane.setHgap(10);
29         pane.setVgap(10);
30         
31         // Create a button to choose a file
32         Button btChooseFile = new Button("Choose File");
33         pane.add(btChooseFile, 0, 0);
34                 
35         // Set the primary stage properties
36         primaryStage.setScene(new Scene(pane, 400, 200));
37         primaryStage.setTitle("Starting...");
38         primaryStage.setResizable(false);
39         primaryStage.show();
40         
41         // 
42         btChooseFile.setOnAction(new EventHandler<ActionEvent>() {
43             @Override
44             public void handle(ActionEvent event) {
45                 FileChooser fileChooser = new FileChooser();
46                 fileChooser.setTitle("Choose File");
47                 fileChooser.setInitialDirectory(new File("J:" + File.separator + "PrtSc" + File.separator + "20190321"));
48                 fileChooser.getExtensionFilters().addAll(new ExtensionFilter("Text Files", "*.txt"), new ExtensionFilter("All Files", "*.*"));
49                 File file = fileChooser.showOpenDialog(primaryStage);
50                 if (file != null) {
51                     System.out.println(file.getAbsolutePath());
52                 }
53             }
54         });
55     }
56 }

UI:

 

 

例2:增加一个缓存文件,用于记录上一次选中的目录。

工程结构:

第62行的代码,涉及到的知识点:Java - byte[] 和 String互相转换

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.FileNotFoundException;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 import java.io.InputStream;
 7 import java.io.OutputStream;
 8 
 9 import javafx.application.Application;
10 import javafx.event.ActionEvent;
11 import javafx.event.EventHandler;
12 import javafx.geometry.Insets;
13 import javafx.geometry.Pos;
14 import javafx.scene.Scene;
15 import javafx.scene.control.Button;
16 import javafx.scene.layout.GridPane;
17 import javafx.stage.FileChooser;
18 import javafx.stage.FileChooser.ExtensionFilter;
19 import javafx.stage.Stage;
20 
21 public class Main extends Application {
22 
23     public static void main(String[] args) {
24         launch(args);
25     }
26     
27     @Override
28     public void start(Stage primaryStage) throws Exception {
29         // Create a pane to hold a button
30         GridPane pane = new GridPane();
31         pane.setStyle("-fx-border-color: green;");
32         pane.setAlignment(Pos.CENTER);
33         pane.setPadding(new Insets(10, 10, 10, 10));
34         pane.setHgap(10);
35         pane.setVgap(10);
36         
37         // Create a button to choose a file
38         Button btChooseFile = new Button("Choose File");
39         pane.add(btChooseFile, 0, 0);
40                 
41         // Set the primary stage properties
42         primaryStage.setScene(new Scene(pane, 400, 200));
43         primaryStage.setTitle("Starting...");
44         primaryStage.setResizable(false);
45         primaryStage.show();
46         
47         // 
48         btChooseFile.setOnAction(new EventHandler<ActionEvent>() {
49             @Override
50             public void handle(ActionEvent event) {
51                 FileChooser fileChooser = new FileChooser();
52                 fileChooser.setTitle("Choose File");
53                 fileChooser.getExtensionFilters().addAll(new ExtensionFilter("All Files", "*.*"));
54                 //
55                 File cacheFile = new File("cache.txt");
56                 if (cacheFile.exists()) {
57                     try (InputStream inputStream = new FileInputStream(cacheFile)) {
58                         byte[] bytes = new byte[(int) cacheFile.length()];
59                         // Read the contents of the cache.txt
60                         inputStream.read(bytes);
61                         //
62                         File directory = new File(new String(bytes));
63                         if (directory.exists()) {
64                             fileChooser.setInitialDirectory(directory);
65                         }
66                     } catch (FileNotFoundException e) {
67                         e.printStackTrace();
68                     } catch (IOException e1) {
69                         e1.printStackTrace();
70                     }
71                 }
72                 //
73                 File file = fileChooser.showOpenDialog(primaryStage);
74                 if (file != null) {
75                     // Store the directory to the cache.txt
76                     try (OutputStream outputStream = new FileOutputStream(cacheFile)) {
77                         byte[] bytes = file.getParent().getBytes();
78                         outputStream.write(bytes);
79                     } catch (FileNotFoundException e) {
80                         e.printStackTrace();
81                     } catch (IOException e) {
82                         e.printStackTrace();
83                     }
84                 }
85             }
86         });
87     }
88 }

 

转载于:https://www.cnblogs.com/Satu/p/10847649.html

### 使用 JavaFX 文件选择器 (FileChooser) 在 Java 中,`FileChooser` 是 `javafx.stage` 包中的一个重要组件,用于让用户能够浏览文件系统并选择单个或多个文件[^2]。 #### 创建基本的 FileChooser 为了创建一个简单的文件选择器对话框,可以按照如下方式编写代码: ```java import javafx.application.Application; import javafx.stage.FileChooser; import javafx.stage.Stage; public class FileChooserExample extends Application { @Override public void start(Stage primaryStage) { // 初始化文件选择器对象 FileChooser fileChooser = new FileChooser(); // 设置初始目录(可选) fileChooser.setInitialDirectory(new java.io.File(System.getProperty("user.home"))); // 添加过滤条件来限定可以选择哪些类型的文件(可选) fileChooser.getExtensionFilters().addAll( new FileChooser.ExtensionFilter("Text Files", "*.txt"), new FileChooser.ExtensionFilter("Image Files", "*.png", "*.jpg", "*.gif") ); // 显示打开文件对话框,并获取用户所选文件 java.io.File selectedFile = fileChooser.showOpenDialog(primaryStage); if(selectedFile != null){ System.out.println("Selected file: " + selectedFile.getAbsolutePath()); }else{ System.out.println("No file chosen."); } } public static void main(String[] args) { launch(args); } } ``` 这段程序展示了如何初始化 `FileChooser` 对象、设置起始位置以及定义扩展名过滤器。最后通过调用 `showOpenDialog()` 方法弹出窗口供用户挑选文件。 对于保存文件的情况,则应使用 `fileChooser.showSaveDialog(stage)` 来代替上述例子中的 `showOpenDialog()`. 这样就可以让应用程序支持保存新文件的功能了。 当涉及到多文件的选择时,可以通过修改 `FileChooser` 的配置参数或者直接调用不同的方法来进行处理。例如,要允许多次选择文件,可以在实例化之后立即执行下面这行命令: ```java fileChooser.setSelectedExtensionFilter(null); // 取消默认筛选器限制 // 或者更推荐的方式是启用多选模式 fileChooser.setMultiSelectionEnabled(true); List<java.io.File> files = fileChooser.showOpenMultipleDialog(primaryStage); if(files!=null && !files.isEmpty()){ for(java.io.File f : files){ System.out.println(f.getAbsolutePath()); } }else{ System.out.println("No files were selected"); } ``` 以上就是有关于怎样利用 JavaFX 构建简单而有效的文件选取界面的一些指导[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值