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

Swing 動態加載磁盤文件到 JTable:JProgressBar 異步加載與隱藏文件標記

     編輯:Java 程式設計入門

需求場景

模擬作業系統打開文件夾:用戶選擇目錄 → 進度條滾動 → 文件逐行顯示於表格 → 隱藏文件標記「隱藏文件」 → 加載完成進度條停止。

架構設計

  • UI 線程:響應按鈕點擊、啟動後台線程、更新進度條狀態。
  • 後台線程:遍歷 File.listFiles()、構建表格模型數據、Thread.sleep(100) 模擬動態效果、通過 SwingUtilities.invokeLater 安全更新 UI。
  • 表格模型:DefaultTableModel 動態增行,列為「序號、文件名、屬性」。

完整代碼(精簡版)

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class FileListFrame extends JFrame {
    private JTextField pathField;
    private JTable table;
    private JProgressBar progressBar;
    private File chosenDir;

    public FileListFrame() {
        setTitle("窗體動態加載磁盤文件");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(450, 300);
        setLocationRelativeTo(null);
        setLayout(new BorderLayout());

        // 北部:路徑輸入 + 瀏覽按鈕 + 進度條
        JPanel north = new JPanel(new FlowLayout(FlowLayout.LEFT));
        pathField = new JTextField(20); pathField.setEditable(false);
        JButton btnChoose = new JButton("選擇文件夾");
        progressBar = new JProgressBar(); progressBar.setPreferredSize(new Dimension(150, 20));
        progressBar.setIndeterminate(false);
        north.add(new JLabel("路徑:")); north.add(pathField); north.add(btnChoose); north.add(progressBar);
        add(north, BorderLayout.NORTH);

        // 中部:表格
        table = new JTable();
        add(new JScrollPane(table), BorderLayout.CENTER);

        // 初始化表頭
        DefaultTableModel model = new DefaultTableModel(new Object[]{"序號", "文件名", "屬性"}, 0);
        table.setModel(model);

        btnChoose.addActionListener(e -> chooseDirectory());
    }

    private void chooseDirectory() {
        JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        if (fc.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) return;

        chosenDir = fc.getSelectedFile();
        pathField.setText(chosenDir.getAbsolutePath());

        progressBar.setIndeterminate(true);  // 開始滾動
        File[] files = chosenDir.listFiles();
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        model.setRowCount(0);  // 清空舊數據

        new Thread(() -> {
            if (files != null) {
                for (int i = 0; i < files.length; i++) {
                    File f = files[i];
                    if (f.isFile()) {
                        Object[] row = {i + 1, f.getName(), f.isHidden() ? "隱藏文件" : ""};
                        // 必須在 EDT 更新模型
                        SwingUtilities.invokeLater(() -> model.addRow(row));
                    }
                    try { Thread.sleep(50); } catch (InterruptedException ignored) {}
                }
            }
            SwingUtilities.invokeLater(() -> progressBar.setIndeterminate(false));
        }).start();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new FileListFrame().setVisible(true));
    }
}

關鍵技術點

  • JFileChooser.DIRECTORIES_ONLY
  • 技術點代碼體現說明
    僅允許選目錄
    不確定進度條setIndeterminate(true/false)不知總進度時的滾動動畫
    後台線程更新 UISwingUtilities.invokeLater(() -> model.addRow(row))Swing 非線程安全,所有模型變更必須在 EDT
    隱藏文件檢測file.isHidden()跨平台:Windows 看屬性位,Linux 看以點開頭

    效果截圖

    文件列表動態加載演示

    進階優化方向

    • 使用 SwingWorker 替代手動 Thread,內置 publish/process 更優雅地處理進度回調。
    • 大目錄下先統計文件數,改用確定進度條 setValue(i) 顯示百分比。
    • 支援文件夾遞歸展開、圖標列、右鍵菜單打開/刪除等。
    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved