エディタやワープロでやるように,ファイルの一覧を出してその中からファイルを選択するようにします。
JFileChooser
を使います。
SanTaku.java に書き加えます
前回の構成
public SanTaku(){ setDefaultCloseOperation(EXIT_ON_CLOSE); m = new Mondaishuu("mondai.txt",10 ); label1 = new JLabel("問題 "+(n+1),JLabel.LEFT); //nは0から問題番号は1から
今回の構成
public SanTakuF(){ setDefaultCloseOperation(EXIT_ON_CLOSE); JFileChooser chooser = new JFileChooser("."); int retVal = chooser.showOpenDialog(this); if (retVal != JFileChooser.APPROVE_OPTION) System.exit(0); File file = chooser.getSelectedFile(); String fname = file.getPath(); m = new Mondaishuu(fname,10); label1 = new JLabel("問題 "+(n+1),JLabel.LEFT); //nは0から問題番号は1から
中にFileクラスを使っているので、次のパッケージをインポートする必要があります。
import java.io.*;
JFileChooser はユーザーがファイルを選択するためのクラスです。newでインスタンスを作り、chooserという名前にしています。
JFileChooserの引数は一覧を出したいフォルダを表す文字列(またはファイルのインスタンス)です。省略するとデフォルトのフォルダ(Linuxではユーザーホーム、Windowsではマイドキュメント)になります。
引数に入れている"."(または"./")はカレントディレクトリを表します。今回の使い方ではユーザーホームのjavaというフォルダがカレントディレクトリです。
chooser.showOpenDialog(this) はchooserに選択のための小さなウィンドウ(これをダイアログといいます)を出させます。thisはこのダイアログがSanTakuFのインスタンスの付属ダイアログ(子)となることを表します。
retVal はchooser.showOpenDialog(this)メソッドの戻り値を受け取ります。ここでの戻り値はダイアログが「開く」でもどったのか「取消し」で戻ったのかということです。選択したファイルの名前ではありません。
if (retVal != JFileChooser.APPROVE_OPTION) はその戻り値がJFileChooserのフィールドに書かれているAPPROVE_OPTIONと同じか調べています。APPROVEは「承認」 なので、!= と組み合わせて「開く」のボタンで戻ったのではないという意味になります。「取消し」ボタンを押したかもしれないし「×」 ボタンでダイアログを閉じてしまったかもしれません。
System.exit(0); その場合には即プログラムを終了させます。
一方選択したファイルの名前を得るにはchooserにgetSelectedFile()メソッドで問い合わせます。それが、chooser.getSelectedFile(); です。
選択したファイルの情報は文字列ではなくFileというクラスのインスタンスとして帰ってきます。そこで、File file に代入しているわけです。
Mondaishuu には文字列でファイルを教えなければならないので、file の中から file.getPath() を使ってファイルの名前(正確にはパスも含めた名前)を文字列で抽出して fname に代入します。
そのfnameで Mondaishuu のインスタンスを作ります。
いつものように実行します。
$ javac SanTakuF.java $ java SanTakuF
最初にファイルの選択画面がでます。mondai.txtなどを選択します。
選択すると問題が始まります。
もしも問題の形式になっていないファイルを選択すると、うまく動かないはずです。ほんとうはそのような場合にファイルの形式が間違っているというメッセージがでて、選択しなおすとか、停止するとかの対策が必用です。
上記SanTakuF.javaをつくり、実行してみなさい