在桌面應用程式中,「開啟檔案」與「儲存檔案」對話框是最常見的使用者介面元件。Java Swing 提供 JFileChooser 元件,並透過 FileFilter 抽象類別讓開發者自訂檔案過濾邏輯。本文透過兩個類別 MyFilter 與 FileChooserDemo,完整示範如何只顯示 .java 副檔名的檔案,並記錄使用者操作結果。
public class MyFilter extends FileFilter {
public boolean accept(File f) {
if (f.isDirectory()) return true; // 目錄永遠顯示
String ext = getExtension(f);
return "java".equals(ext); // 僅接受 .java 檔
}
public String getDescription() { return "Java"; }
// 取得副檔名小寫
public static String getExtension(File f) { ... }
}
accept():回傳 true 表示該檔案/目錄會出現在清單中。目錄必須回傳 true,否則使用者無法瀏覽資料夾結構。getDescription():顯示在對話框「檔案類型」下拉選單的說明文字。getExtension():工具方法,擷取副檔名並轉小寫比對。fc = new JFileChooser("."); // 起始目錄為當前目錄
fc.addChoosableFileFilter(new MyFilter()); // 加入自訂過濾器
openButton = new JButton("開啟檔案", createImageIcon("images/Open16.gif"));
saveButton = new JButton("儲存檔案", createImageIcon("images/Save16.gif"));
版面採用 BorderLayout:上方按鈕列、中央 JTextArea(置於 JScrollPane)顯示操作日誌。
public void actionPerformed(ActionEvent e) {
if (e.getSource() == openButton) {
int returnVal = fc.showOpenDialog(FileChooserDemo.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
log.append("開啟檔案: " + fc.getSelectedFile().getName() + "\n");
} else {
log.append("開啟檔案被使用者取消!\n");
}
} else if (e.getSource() == saveButton) {
int returnVal = fc.showSaveDialog(FileChooserDemo.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
log.append("儲存檔案: " + fc.getSelectedFile().getName() + "\n");
} else {
log.append("儲存檔案被使用者取消!\n");
}
}
}
showOpenDialog() / showSaveDialog():分別顯示開啟/儲存對話框,會阻塞直到使用者關閉。APPROVE_OPTION:使用者按下「開啟」或「儲存」按鈕。getSelectedFile():取得使用者選取的 File 物件。protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = FileChooserDemo.class.getResource(path);
return (imgURL != null) ? new ImageIcon(imgURL) : null;
}
使用 Class.getResource() 可正確載入打包在 JAR 內的圖片資源。
啟動後出現視窗,點擊「開啟檔案」或「儲存檔案」會彈出對話框,檔案清單僅顯示資料夾與 .java 檔案。操作完成後,中央文字區會記錄檔名或「取消」訊息。
addChoosableFileFilter() 可重複呼叫,讓使用者在下拉選單切換「Java 檔」「所有檔」等。JFileChooser.setAccessory() 加入縮圖或內容預覽元件。approveSelection() 在確定前檢查副檔名、覆寫確認等。JFileChooser 配合 FileFilter 提供靈活的檔案選擇體驗。掌握 accept()、getDescription() 兩個核心方法,即可依業務需求客製化檔案清單,提升使用者操作效率。