演示 JFileChooser 兩大核心模式:
showOpenDialog(),支持多選、預覽、文件類型過濾showSaveDialog(),自動提示覆蓋確認並實現自定義 FileFilter:僅顯示目錄與 .java 文件。
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;
}
}
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 鏈式配置,推薦新項目優先採用。