
Swingアプリ開発ステップアップガイド
Swing初級から中級者向けに、4つの異なるアプリケーションを段階的に開発する方法を解説します。各アプリケーションは独立しており、難易度順に並んでいます。 ① […]
Swingアプリケーションでファイルの選択や保存を行う際に、JFileChooser
は非常に便利なコンポーネントです。ネイティブのファイルダイアログを表示できるため、OSに統合された使い慣れたインターフェースを提供できます。
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);
});
}
}
fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
if (selectedFile.exists()) {
int confirm = JOptionPane.showConfirmDialog(frame,
"ファイルが既に存在します。上書きしますか?",
"上書き確認",
JOptionPane.YES_NO_OPTION);
if (confirm != JOptionPane.YES_OPTION) {
return;
}
}
String fileName = selectedFile.getName();
if (!fileName.toLowerCase().endsWith(".txt")) {
selectedFile = new File(selectedFile.getParent(), fileName + ".txt");
}
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(getLastUsedDirectory()); // 前回のディレクトリを取得
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
クラスを使用して独自のダイアログボックスを作成する方法を解説します。