ファイル選択ダイアログ(JFileChooser)の活用

2025-08-06

Swingアプリケーションでファイルの選択や保存を行う際に、JFileChooserは非常に便利なコンポーネントです。ネイティブのファイルダイアログを表示できるため、OSに統合された使い慣れたインターフェースを提供できます。

JFileChooserの基本

jfilechooser-in-Java

基本的なファイル選択ダイアログ

import javax.swing.*;
import java.awt.event.ActionEvent;

public class BasicFileChooserExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("基本的なJFileChooser");
            frame.setSize(500, 400);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JButton openButton = new JButton("ファイルを開く");
            openButton.addActionListener(e -> {
                JFileChooser fileChooser = new JFileChooser();
                int returnValue = fileChooser.showOpenDialog(frame);

                if (returnValue == JFileChooser.APPROVE_OPTION) {
                    JOptionPane.showMessageDialog(frame, 
                        "選択されたファイル: " + fileChooser.getSelectedFile().getName(),
                        "ファイル選択結果",
                        JOptionPane.INFORMATION_MESSAGE);
                }
            });

            frame.add(openButton);
            frame.setVisible(true);
        });
    }
}

ファイル選択モードの設定

JFileChooserには3つの選択モードがあります:

モード定数説明
ファイルのみJFileChooser.FILES_ONLYファイルのみ選択可能
ディレクトリのみJFileChooser.DIRECTORIES_ONLYディレクトリのみ選択可能
両方JFileChooser.FILES_AND_DIRECTORIES両方選択可能
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;

public class FileChooserModeExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("ファイル選択モード例");
            frame.setSize(500, 400);
            frame.setLayout(new GridLayout(3, 1));

            JButton fileButton = new JButton("ファイル選択モード");
            fileButton.addActionListener(e -> {
                JFileChooser chooser = new JFileChooser();
                chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                chooser.showOpenDialog(frame);
            });

            JButton dirButton = new JButton("ディレクトリ選択モード");
            dirButton.addActionListener(e -> {
                JFileChooser chooser = new JFileChooser();
                chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                chooser.showOpenDialog(frame);
            });

            JButton bothButton = new JButton("両方選択可能モード");
            bothButton.addActionListener(e -> {
                JFileChooser chooser = new JFileChooser();
                chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
                chooser.showOpenDialog(frame);
            });

            frame.add(fileButton);
            frame.add(dirButton);
            frame.add(bothButton);
            frame.setVisible(true);
        });
    }
}

ファイルフィルタの設定

特定の種類のファイルのみ表示するフィルタを設定できます。

import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.event.ActionEvent;

public class FileFilterExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("ファイルフィルタ例");
            frame.setSize(500, 400);

            JButton openButton = new JButton("画像ファイルを選択");
            openButton.addActionListener(e -> {
                JFileChooser chooser = new JFileChooser();

                // 画像ファイルフィルタ
                FileNameExtensionFilter imageFilter = new FileNameExtensionFilter(
                    "画像ファイル (JPEG, PNG, GIF)", "jpg", "jpeg", "png", "gif");

                // テキストファイルフィルタ
                FileNameExtensionFilter textFilter = new FileNameExtensionFilter(
                    "テキストファイル", "txt", "csv");

                chooser.addChoosableFileFilter(imageFilter);
                chooser.addChoosableFileFilter(textFilter);
                chooser.setFileFilter(imageFilter); // デフォルトフィルタ

                int returnValue = chooser.showOpenDialog(frame);
                if (returnValue == JFileChooser.APPROVE_OPTION) {
                    System.out.println("選択されたファイル: " + chooser.getSelectedFile());
                    System.out.println("使用されたフィルタ: " + chooser.getFileFilter().getDescription());
                }
            });

            frame.add(openButton);
            frame.setVisible(true);
        });
    }
}

ファイル保存ダイアログ

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

public class FileSaveExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("ファイル保存例");
            frame.setSize(500, 400);

            JButton saveButton = new JButton("ファイルを保存");
            saveButton.addActionListener(e -> {
                JFileChooser chooser = new JFileChooser();
                chooser.setDialogTitle("保存先を指定");

                // デフォルトのファイル名を設定
                chooser.setSelectedFile(new File("document.txt"));

                int returnValue = chooser.showSaveDialog(frame);
                if (returnValue == JFileChooser.APPROVE_OPTION) {
                    File selectedFile = chooser.getSelectedFile();
                    JOptionPane.showMessageDialog(frame, 
                        selectedFile.getName() + " に保存します",
                        "保存確認",
                        JOptionPane.INFORMATION_MESSAGE);
                    // ここで実際の保存処理を実行
                }
            });

            frame.add(saveButton);
            frame.setVisible(true);
        });
    }
}

カスタムファイル選択ダイアログ

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

public class CustomFileChooserExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("カスタムJFileChooser");
            frame.setSize(600, 400);

            JButton customButton = new JButton("カスタムファイル選択ダイアログを表示");
            customButton.addActionListener(e -> {
                JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());

                // ダイアログのタイトル設定
                chooser.setDialogTitle("カスタムファイル選択");

                // 複数選択を許可
                chooser.setMultiSelectionEnabled(true);

                // ファイル選択モード
                chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

                // ファイルフィルタ
                FileNameExtensionFilter filter = new FileNameExtensionFilter(
                    "Javaファイル", "java", "class", "jar");
                chooser.setFileFilter(filter);

                // アクセサリコンポーネントの追加
                JPanel accessory = new JPanel();
                accessory.add(new JLabel("詳細設定:"));
                accessory.add(new JCheckBox("隠しファイルを表示"));
                chooser.setAccessory(accessory);

                // ダイアログボタンのテキスト変更
                chooser.setApproveButtonText("このファイルを選択");
                chooser.setApproveButtonToolTipText("選択したファイルを使用します");

                int returnValue = chooser.showOpenDialog(frame);
                if (returnValue == JFileChooser.APPROVE_OPTION) {
                    File[] selectedFiles = chooser.getSelectedFiles();
                    StringBuilder message = new StringBuilder("選択されたファイル:\n");
                    for (File file : selectedFiles) {
                        message.append("- ").append(file.getName()).append("\n");
                    }
                    JOptionPane.showMessageDialog(frame, message.toString());
                }
            });

            frame.add(customButton);
            frame.setVisible(true);
        });
    }
}

ファイル選択ダイアログのベストプラクティス

  1. 初期ディレクトリの設定 – ユーザーがよく使うディレクトリから開始
   fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
  1. ファイル上書き確認 – 保存時に既存ファイルを上書きするか確認
   if (selectedFile.exists()) {
       int confirm = JOptionPane.showConfirmDialog(frame, 
           "ファイルが既に存在します。上書きしますか?",
           "上書き確認",
           JOptionPane.YES_NO_OPTION);
       if (confirm != JOptionPane.YES_OPTION) {
           return;
       }
   }
  1. ファイル拡張子の自動追加 – ユーザーが拡張子を省略した場合に自動追加
   String fileName = selectedFile.getName();
   if (!fileName.toLowerCase().endsWith(".txt")) {
       selectedFile = new File(selectedFile.getParent(), fileName + ".txt");
   }
  1. 最近使ったファイルの記録 – アプリケーション終了後も保持
   JFileChooser chooser = new JFileChooser();
   chooser.setCurrentDirectory(getLastUsedDirectory()); // 前回のディレクトリを取得
  1. 非同期処理 – 大量のファイルがあるディレクトリでのUIブロックを防止
   SwingWorker worker = new SwingWorker<>() {
       @Override
       protected Void doInBackground() throws Exception {
           // ファイル操作の重い処理
           return null;
       }
   };
   worker.execute();

実践例:画像ビューアアプリケーション

import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class ImageViewerApp {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("画像ビューア");
            frame.setSize(800, 600);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            // メニューバーの作成
            JMenuBar menuBar = new JMenuBar();
            JMenu fileMenu = new JMenu("ファイル");

            JMenuItem openItem = new JMenuItem("画像を開く");
            openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_DOWN_MASK));

            fileMenu.add(openItem);
            menuBar.add(fileMenu);
            frame.setJMenuBar(menuBar);

            // 画像表示用ラベル
            JLabel imageLabel = new JLabel("", SwingConstants.CENTER);
            frame.add(new JScrollPane(imageLabel), BorderLayout.CENTER);

            // ステータスバー
            JLabel statusBar = new JLabel("準備完了");
            frame.add(statusBar, BorderLayout.SOUTH);

            // 画像オープン処理
            openItem.addActionListener(e -> {
                JFileChooser chooser = new JFileChooser();
                chooser.setDialogTitle("画像を選択");

                FileNameExtensionFilter filter = new FileNameExtensionFilter(
                    "画像ファイル", ImageIO.getReaderFileSuffixes());
                chooser.setFileFilter(filter);

                int returnValue = chooser.showOpenDialog(frame);
                if (returnValue == JFileChooser.APPROVE_OPTION) {
                    File selectedFile = chooser.getSelectedFile();
                    statusBar.setText("読み込み中: " + selectedFile.getName());

                    // 別スレッドで画像読み込み
                    new SwingWorker() {
                        @Override
                        protected BufferedImage doInBackground() throws Exception {
                            return ImageIO.read(selectedFile);
                        }

                        @Override
                        protected void done() {
                            try {
                                BufferedImage image = get();
                                if (image != null) {
                                    imageLabel.setIcon(new ImageIcon(image));
                                    statusBar.setText("読み込み完了: " + selectedFile.getName() + 
                                        " (" + image.getWidth() + "x" + image.getHeight() + ")");
                                }
                            } catch (Exception ex) {
                                statusBar.setText("エラー: " + ex.getMessage());
                                JOptionPane.showMessageDialog(frame, 
                                    "画像の読み込みに失敗しました", 
                                    "エラー", 
                                    JOptionPane.ERROR_MESSAGE);
                            }
                        }
                    }.execute();
                }
            });

            frame.setVisible(true);
        });
    }
}

JFileChooserを適切に活用することで、ユーザーに使いやすいファイル選択インターフェースを提供できます。次に学ぶ「カスタムダイアログの作成」では、JDialogクラスを使用して独自のダイアログボックスを作成する方法を解説します。