質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Q&A

解決済

1回答

1172閲覧

Swing JFileChooser+Serializableを使って「名前をつけて保存」を実装したいのですが・・・

hood

総合スコア351

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

0グッド

1クリップ

投稿2018/12/29 10:28

###JFileChooser+Serializableを使った「名前をつけて保存」の実装
複雑なことをお聞きします。長文です。最初にコードとダイアログの画像を見た方がいいかもしれません。それらは一番下にありますので参考までに・・・


題目通り、私はいわゆる「名前をつけて保存」を実装したいと思っています。(ここでの「保存」はSwingのGUI自体の状態保存で、特定のテキストファイルや画像データではありません。)

しかし、二つの問題があって、いまだ目標に達していません。

一つ目は「JFileChooserのダイアログで入力したファイル名」を得る手段がないということです。
「新規保存させるためのファイル名」を得ないことにはデータの保存もあったものではないのですが、oracleのサイトを見ても、それらしいメソッドはありませんでした。

二つ目。これは一つ目の問題の解決で発生すると予想される問題なのですが、FileOutputStream fos = new FileOutputStream();の引数に指定する変数です。
というのも侍エンジニアのサイトのサイトを見ると、FileOutputStreamの引数には、(path/ファイル名)を入れるとあります。
しかし、「JFileChooserのダイアログのディリクトリ」と「JFileChooserのダイアログで入力したファイル名」をゲットしても、それをどのようにFileOutputStream()に指定すればいいのか・・・推測もできません。

言葉ではどうにも説明が上手くいかないので下に未完成のコードを記します。
解決策、代替策、ささいなことでも構いません。
ご助言いただけたら助かります・・・・

java

1mntmSave.addActionListener(new ActionListener() {//新規保存ボタンを押したら 2 @Override 3 public void actionPerformed(ActionEvent e) { 4 File dir = new File("C:\Users\foods\Desktop"); 5 JFileChooser filechooser = new JFileChooser(dir);//Desktopを初期表示に設定。 6 7 int selected = filechooser.showSaveDialog(Main.this);//セーブダイアログの表示 8 if (selected == JFileChooser.APPROVE_OPTION){ 9 try{ 10 File path = filechooser.getCurrentDirectory();//カレントディリクトリをゲット。 11   ?//ここで新規保存させるためのファイル名を得たい 12 FileOutputStream fos = new FileOutputStream(?);//fileoutputstreamの引数には、path/ファイルと指定するはずなのに・・・どのように指定すれば? 13                //入手したカレントディリクトリとファイル名を組み合わせる? 14 ObjectOutputStream objOutStream = new ObjectOutputStream(fos); 15 objOutStream.writeObject(new Main());//保存したいオブジェクトを書き込む。 16 objOutStream.close(); 17 18 }catch (FileNotFoundException e1) { 19 e1.printStackTrace(); 20 } catch (IOException e1) { 21 e1.printStackTrace(); 22 } 23 }else if (selected == JFileChooser.CANCEL_OPTION) { 24 25 }else if (selected == JFileChooser.ERROR_OPTION) { 26 27 } 28 29 } 30 });

以下の画像を参考にしています。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ダイアログで入力したファイル名を得る手段がない

確かにないですが、それは「その必要がないから」です。JFileChooser#getSelectedFileを使えば充分なのです。

FileOutputStream()の引数

JFileChooserから得られる情報に基づきFileOutputSteramを生成する方法にはいくつか選択肢がありますが一番簡単なのは次のようにすることだと思います。

java

1File selectedFile = fileChooser.getSelectedFile(); 2try (FileOutputStream fos = new FileOutputStream(selectedFile)) { 3 ... 4}

質問者さんはJFileChooserクラスについてはリファレンスを調べておられます。その点はよいと思います。しかしFileOutputStreamクラスについてはリファレンスを見ずに一部しか機能を説明していないようなサイトだけしか見ていないのではないでしょうか?このクラスについてもリファレンスをちゃんと見るべきだったと思います。そうすれば

  • FileOutputStreamのコンストラクターにはStringのパスもFileによるパスも両方使える
  • JFileChooserには選択されたファイル名を得る機能は確かにないがgetSelectedFileがあれば充分

ということに気づけたのではないでしょうか?

投稿2018/12/29 12:49

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hood

2018/12/29 21:37

KSwordOfHasteさん、再びの回答ありがとうございます!! >FileOutputStreamクラスについてはリファレンスを見ずに一部しか機能を説明していないようなサイトだけしか見ていない まさにその通りでした・・・・私はリファレンスを見る習慣をつけることも知らなかったので、今までブラウザでキーワードを入力して手当たり次第に参考サイトを漁っていました。今ここで、リファレンスが参考の基本で拡張的に他のサイトを見るということを学ばせていただきました! >JFileChooser#getSelectedFileを使えば充分 そうだったのですね・・・早速試してみたいと思います。 返す返すどうもありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問