在桌面應用開發中,文件選擇與過濾是常見需求。本文將詳細講解如何使用 Swing 的 JFileChooser 結合自定義 FileFilter 實現「選擇目錄 → 輸入擴展名 → 即時過濾顯示」的完整功能,並附帶完整可運行代碼與界面截圖。
JButton):觸發目錄選擇對話框,限制只能選資料夾JLabel):顯示用戶選中的絕對路徑JTextField):輸入如 gif、.txt 等,支援帶/不帶點號JTable):三欄顯示「文件名、大小、修改日期」,不可編輯「選擇目錄」與「輸入框文字變化」都需要觸發過濾刷新,因此將核心邏輯封裝為 listFiles() 私有方法:
dir.listFiles(new CustomFilter()) 獲取符合條件的文件數組DefaultTableModel,先 setRowCount(0) 清空getName()、length()、lastModified() 組裝行數據並 addRow()CustomFilterprivate final class CustomFilter implements java.io.FileFilter {
@Override
public boolean accept(File pathname) {
String extName = extNameField.getText(); // 取用戶輸入
if (extName == null || extName.isEmpty()) return false;
if (!extName.startsWith(".")) extName = "." + extName; // 自動補點
extName = extName.toLowerCase();
return pathname.getName().toLowerCase().endsWith(extName);
}
}
亮點:內部類直接訪問外部類的 extNameField,無需額外傳參;統一轉小寫實現大小寫不敏感匹配。
protected void do_button_actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); // 只選資料夾
chooser.showDialog(this, null);
dir = chooser.getSelectedFile();
label.setText(dir == null ? "" : dir.toString());
listFiles(); // 立即刷新
}
extNameField.addCaretListener(e -> listFiles()); // 任意文字變化即觸發
代碼已整理為單文件 ListCustomTypeFile.java,包含所有 import、主類、內部類、GUI 構建與事件處理,複製即可在 JDK 8+ 環境直接運行。

圖中展示:選擇某圖片資料夾,輸入 gif 後表格即時列出所有 GIF 文件及其大小、修改時間。
toLowerCase() 解決false,避免列出所有文件Files.newDirectoryStream + 背景線程本例展示了 Swing 開發中「視圖-模型分離、事件統一入口、內部類訪問外部狀態」的典型模式,代碼結構清晰,適合作為文件管理類工具的基礎模板。