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

Java Swing 實現簡易目錄查詢器 GUI 完整教程

     編輯:Java 相關知識

專案目標

使用 AWT/Swing 構建桌面應用,輸入目錄路徑,點擊按鈕遞歸列出所有文件/子目錄名稱。

完整代碼實現

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

public class DirectoryExplorer extends JFrame {
    private final JTextField pathField = new JTextField(30);
    private final JTextArea resultArea = new JTextArea(25, 70);
    private final JButton searchBtn = new JButton("查詢");
    
    public DirectoryExplorer() {
        initUI();
        bindEvents();
    }
    
    private void initUI() {
        setTitle("目錄查詢器");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout());
        setSize(600, 500);
        setLocationRelativeTo(null); // 居中
        
        add(new JLabel("目錄路徑:"));
        add(pathField);
        add(searchBtn);
        add(new JScrollPane(resultArea)); // 加滾動條
        resultArea.setEditable(false);
        resultArea.setFont(new Font("Monospaced", Font.PLAIN, 14));
    }
    
    private void bindEvents() {
        searchBtn.addActionListener(e -> doSearch());
        pathField.addActionListener(e -> doSearch()); // Enter 鍵觸發
    }
    
    private void doSearch() {
        String path = pathField.getText().trim();
        if (path.isEmpty()) {
            JOptionPane.showMessageDialog(this, "請輸入目錄路徑");
            return;
        }
        File dir = new File(path);
        if (!dir.exists() || !dir.isDirectory()) {
            JOptionPane.showMessageDialog(this, "路徑不存在或非目錄: " + path);
            return;
        }
        
        // 清空舊結果
        resultArea.setText("");
        
        // 遞歸列舉(這裡簡單演示,大目錄建議用 SwingWorker 異步)
        listFiles(dir, "");
    }
    
    private void listFiles(File file, String indent) {
        resultArea.append(indent + file.getName() + (file.isDirectory() ? "/" : "") + "\n");
        if (file.isDirectory()) {
            File[] children = file.listFiles();
            if (children != null) {
                for (File child : children) {
                    listFiles(child, indent + "  ");
                }
            }
        }
    }
    
    public static void main(String[] args) {
        // EDT 執行緒啟動 GUI
        SwingUtilities.invokeLater(() -> new DirectoryExplorer().setVisible(true));
    }
}

關鍵知識點解析

技術點說明
EDT (Event Dispatch Thread)Swing 所有 UI 操作必須在 EDT 執行,使用 SwingUtilities.invokeLater() 啟動。
JScrollPane包裝 JTextArea 提供滾動條,防止內容超出可視區域。
遞歸遍歷File.listFiles() 返回 null 時需判空(權限不足或非目錄)。
大目錄阻塞 UI生產環境必須用 SwingWorker 或 ExecutorService 異步執行,完成後 SwingUtilities.invokeLater() 更新 UI。
編碼問題文件名含中文時,控制台輸出可能亂碼,GUI 組件通常正常(依賴字體)。

進階:SwingWorker 異步版本

private void doSearchAsync() {
    String path = pathField.getText().trim();
    File dir = new File(path);
    resultArea.setText("掃描中...\n");
    searchBtn.setEnabled(false);
    
    new SwingWorker<Void, String>() {
        @Override
        protected Void doInBackground() throws Exception {
            scanAndPublish(dir, "");
            return null;
        }
        
        private void scanAndPublish(File file, String indent) {
            publish(indent + file.getName() + (file.isDirectory() ? "/" : ""));
            if (file.isDirectory()) {
                File[] kids = file.listFiles();
                if (kids != null) for (File k : kids) scanAndPublish(k, indent + "  ");
            }
        }
        
        @Override
        protected void process(java.util.List<String> chunks) {
            for (String line : chunks) resultArea.append(line + "\n");
        }
        
        @Override
        protected void done() {
            searchBtn.setEnabled(true);
            resultArea.append("\n掃描完成。\n");
        }
    }.execute();
}

現代替代方案提示

  • JavaFX:更現代的 UI 技術棧,FXML 分離視圖,支援 CSS 樣式。
  • Electron / Tauri:前端技術棧構建桌面應用,生態豐富。
  • Compose for Desktop (Kotlin):聲明式 UI,跨平台一致性強。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved