首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java Swing 實現指定類型檔案過濾顯示:JFileChooser 與 JTable 完整實戰

     編輯:Java 程式設計入門

專案概述

本範例構建一個 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;
    ...
}

關鍵功能實現

1. 自定義檔案過濾器

內部類 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);
    }
}

2. 目錄選擇與即時刷新

按鈕事件中配置 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();
}

3. 文字變更即時過濾

為文字框註冊 CaretListener,任何輸入變化即觸發 listFiles():

extNameField.addCaretListener(e -> listFiles());

4. 表格資料填充邏輯

使用 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 設計。
  • 資源釋放:雖本範例為簡易 Demo,實際專案建議在視窗關閉時釋放資源。

擴充建議

  • 新增「包含子目錄」核取方塊,切換 listFiles() 與遞歸掃描。
  • 支援多副檔名(逗號分隔)或正則表達式過濾。
  • 加入右鍵選單:開啟檔案、複製路徑、刪除等操作。
  • 大量檔案時引入 SwingWorker 異步載入,避免 UI 凍結。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved