本範例構建一個 Swing 桌面應用程式,允許使用者選擇目錄、輸入副檔名(如 .gif、.txt),即時在表格中顯示符合條件的檔案名稱、大小與修改日期。展示了 JFileChooser、FileFilter、JTable、DefaultTableModel 等核心 Swing 元件的協同運作。
.gif)。JScrollPane 包裹的 JTable,三欄分別為「檔案名稱」「檔案大小」「修改日期」,不可編輯。public class ListCustomTypeFile extends JFrame {
// 自定義檔案過濾器內部類
private final class CustomFilter implements java.io.FileFilter { ... }
// UI 元件
private JPanel contentPane;
private JTextField extNameField;
private JTable table;
private File dir;
private JLabel label;
...
}
內部類 CustomFilter 實現 FileFilter 介面,動態讀取文字框輸入的副檔名,自動補全前綴點號並轉小寫比對:
private 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);
}
}
按鈕事件中配置 JFileChooser.DIRECTORIES_ONLY 僅允許選目錄,選擇後更新路徑標籤並呼叫 listFiles() 刷新表格:
protected void do_button_actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.showDialog(this, null);
dir = chooser.getSelectedFile();
getLabel().setText(dir.toString());
listFiles();
}
為文字框註冊 CaretListener,任何輸入變化即觸發 listFiles():
extNameField.addCaretListener(e -> listFiles());
使用 DefaultTableModel 動態管理行資料,清空後遍歷過濾後的檔案陣列,提取名稱、長度、最後修改時間(轉 java.sql.Date 顯示):
private void listFiles() {
if (dir == null) return;
File[] files = dir.listFiles(new CustomFilter());
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setRowCount(0);
for (File file : files) {
Object[] row = { file.getName(), file.length(), new Date(file.lastModified()) };
model.addRow(row);
}
}

介面直觀:選擇目錄後,輸入 .java 即刻過濾出所有 Java 原始碼檔,支援任意副檔名動態查詢。
CustomFilter,UI 與業務邏輯解耦。ActionListener + 文字框 CaretListener 雙重觸發同一刷新方法。DefaultTableModel 而非直接操作 JTable,符合 MVC 設計。listFiles() 與遞歸掃描。SwingWorker 異步載入,避免 UI 凍結。