概要

Swingのファイル選択ダイアログを表示させるにはJFileChooserを使います。保存用と読み込み用で分かれていて、保存のときはshowSaveDialog、読み込みのときはshowOpenDialogを使います。この2つのメソッドはユーザーの操作によって返ってくる値が変わっていて、その値はJFileChooserの定数で判断できます。今回はユーザーがファイルを選択し『保存』または『開く』ボタンを押したときに返ってくるJFileChooser.APPROVE_OPTIONの場合のみの処理を書いたサンプルプログラムを載せます。

今回のサンプルプログラムは簡易的なメモ帳の様なプログラムです。テキストエリアでテキストを編集したものを保存したり、読み込んだテキストファイルをテキストエリアに表示したりするサンプルです。読み込みや保存はメニューバーより選択するように作りました。

ソースコード

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JFileChooser;

import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;

import javax.swing.SwingUtilities;
import java.awt.Dimension;

import java.nio.file.Files;
import java.nio.charset.StandardCharsets;

import java.io.IOException;

public class FileChooseSample{
    public static void main(String... args){
        SwingUtilities.invokeLater(FileChooseSample::start);
    }
    
    private static void start(){
        var frame = new JFrame();
        
        var memoArea = new JTextArea();
        memoArea.setPreferredSize(new Dimension(400, 300));
        
        var menubar = new JMenuBar();
        
        var fileMenu = new JMenu("ファイル(F)");
        fileMenu.setMnemonic('F');
        
        var saveItem = new JMenuItem("保存(S)", 'S');
        saveItem.addActionListener(e -> FileChooseSample.saveItemClicked(frame, memoArea));
        
        var openItem = new JMenuItem("開く(O)", 'O');
        openItem.addActionListener(e -> FileChooseSample.openItemClicked(frame, memoArea));
        
        fileMenu.add(saveItem);
        fileMenu.add(openItem);
        
        menubar.add(fileMenu);
        frame.setJMenuBar(menubar);
        
        frame.add(memoArea);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
    }
    
    private static void saveItemClicked(JFrame parent, JTextArea textArea){
        var fileChooser = new JFileChooser();

        //保存用ファイル選択ダイアログを表示する
        if(fileChooser.showSaveDialog(parent) == JFileChooser.APPROVE_OPTION){
            var path = fileChooser.getSelectedFile().toPath();

            try{
                Files.write(path, textArea.getText().getBytes(StandardCharsets.UTF_8));
            }catch(IOException e){
                JOptionPane.showMessageDialog(parent, "ファイルの書き込みに失敗しました", "ファイル書き込みエラー", JOptionPane.ERROR_MESSAGE);
                e.printStackTrace();
            }
        }
    }
    
    private static void openItemClicked(JFrame parent, JTextArea textArea){
        var fileChooser = new JFileChooser();

        //読み込み用ファイル選択ダイアログを表示する
        if(fileChooser.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION){
            var path = fileChooser.getSelectedFile().toPath();
            
            try{
                Files.readAllLines(path, StandardCharsets.UTF_8).stream().forEach(s -> textArea.append(s + "\n"));
            }catch(IOException e){
                JOptionPane.showMessageDialog(parent, "ファイルの読み込みに失敗しました", "ファイル読み込みみエラー", JOptionPane.ERROR_MESSAGE);
                e.printStackTrace();
            }
        }
    }
}