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

Swing 文件選擇器實戰:JFileChooser 自定義過濾器與雙模式對話框

     編輯:Java 程式設計入門

功能概覽

演示 JFileChooser 兩大核心模式:

  • 打開文件對話框:showOpenDialog(),支持多選、預覽、文件類型過濾
  • 保存文件對話框:showSaveDialog(),自動提示覆蓋確認

並實現自定義 FileFilter:僅顯示目錄與 .java 文件。

自定義過濾器:MyFilter

import javax.swing.filechooser.FileFilter;
import java.io.File;

public class MyFilter extends FileFilter {
    @Override
    public boolean accept(File f) {
        if (f.isDirectory()) return true; // 目錄始終顯示
        String ext = getExtension(f);
        return "java".equalsIgnoreCase(ext); // 僅 .java 文件
    }

    @Override
    public String getDescription() {
        return "Java 源文件 (*.java)";
    }

    public static String getExtension(File f) {
        String name = f.getName();
        int dot = name.lastIndexOf('.');
        return (dot > 0 && dot < name.length() - 1) ? name.substring(dot + 1).toLowerCase() : null;
    }
}

主面板:FileChooserDemo

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

public class FileChooserDemo extends JPanel implements ActionListener {
    private JTextArea logArea;
    private JFileChooser chooser;

    public FileChooserDemo() {
        super(new BorderLayout());

        // 日誌區
        logArea = new JTextArea(15, 40);
        logArea.setEditable(false);
        logArea.setMargin(new Insets(10, 10, 10, 10));
        add(new JScrollPane(logArea), BorderLayout.CENTER);

        // 文件選擇器:初始目錄為當前工作目錄
        chooser = new JFileChooser(".");
        chooser.addChoosableFileFilter(new MyFilter()); // 添加自定義過濾器
        chooser.setAcceptAllFileFilterUsed(false); // 可選:隱藏 "All Files" 選項

        // 工具欄按鈕
        JButton openBtn = new JButton("打開文件", createIcon("images/Open16.gif"));
        JButton saveBtn = new JButton("保存文件", createIcon("images/Save16.gif"));
        openBtn.addActionListener(this);
        saveBtn.addActionListener(this);

        JPanel btnBar = new JPanel();
        btnBar.add(openBtn);
        btnBar.add(saveBtn);
        add(btnBar, BorderLayout.PAGE_START);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == openBtn) {
            int ret = chooser.showOpenDialog(this);
            if (ret == JFileChooser.APPROVE_OPTION) {
                File f = chooser.getSelectedFile();
                log("打開文件: " + f.getName());
                // TODO: 實際讀取處理
            } else {
                log("打開操作已取消");
            }
        } else if (e.getSource() == saveBtn) {
            int ret = chooser.showSaveDialog(this);
            if (ret == JFileChooser.APPROVE_OPTION) {
                File f = chooser.getSelectedFile();
                log("保存文件: " + f.getName());
                // TODO: 實際寫入處理
            } else {
                log("保存操作已取消");
            }
        }
    }

    private void log(String msg) {
        logArea.append(msg + "\n");
        logArea.setCaretPosition(logArea.getDocument().getLength());
    }

    protected static ImageIcon createIcon(String path) {
        java.net.URL url = FileChooserDemo.class.getResource(path);
        return (url != null) ? new ImageIcon(url) : null;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame f = new JFrame("FileChooserDemo");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setContentPane(new FileChooserDemo());
            f.pack();
            f.setVisible(true);
        });
    }
}

進階配置技巧

需求API
多文件選擇chooser.setMultiSelectionEnabled(true) + getSelectedFiles()
設置默認文件名(保存模式)chooser.setSelectedFile(new File("default.java"))
文件預覽面板chooser.setAccessory(new PreviewPanel()) 實現 JComponent
僅選目錄chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY)
文件系統視圖定制chooser.setFileSystemView(customView)

現代化替代

JavaFX 提供 FileChooser / DirectoryChooser,API 更簡潔(showOpenDialog(Stage) 返回 File),支持 Stage 模態、ExtensionFilter 鏈式配置,推薦新項目優先採用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved