ファイル選択にフィルタを付ける

.txt だけという選択ができるように

ファイルのタイプが .txt だけだと選択しやすいので、これを実装します。

filechooser

新しいclassを作ります

ファイル名 MyFileFilter.java

public class MyFileFilter extends javax.swing.filechooser.FileFilter {
	String ext , msg;
	public MyFileFilter(String ex , String ms) {
		ext = ex;
		msg = ms;
	}
	public boolean accept(java.io.File f) {
		return f.getName().endsWith(ext);
	}
	public String getDescription() { return msg; }
}

コンパイルだけします。実行できません。

SanTakF.java に書き加えます

ファイル名 SanTakuF.java

前回の構成

public SanTakuF(){
	setDefaultCloseOperation(EXIT_ON_CLOSE); //終了処理を追加
	JFileChooser chooser = new JFileChooser("./");
	int retVal = chooser.showOpenDialog(this);

今回の構成

public SanTakuF(){
	setDefaultCloseOperation(EXIT_ON_CLOSE); //終了処理を追加
	JFileChooser chooser = new JFileChooser("./");
	MyFileFilter filter = new MyFileFilter(".txt" , "テキストファイル(*.txt)");
	chooser.addChoosableFileFilter(filter);
	int retVal = chooser.showOpenDialog(this);

これで、最初から、.txtの拡張子のファイルだけを表示します。

filechooser

ファイルタイプの右の▼をクリックすることで、「全てのファイル」に戻すことも可能です。

filechooser

SanTaku.jarも改良

もしも、この改良の後で SanTaku.jar を作るならば、 jarコマンドにMyFileFilter.classを加える必用があります。

$ jar cvfm SanTakuF.jar SanTakuF.txt SanTakuF.class Mondaishuu.class Toi.class MyFileFilter.class

もちろん、何もしなければ新しいSanTakuF.javaはフィルターありで、古いSanTakuF.jarはフィルターなしでそれぞれ問題なく動きます。 でも、新しいSanTakuF.javaはMyFileFilter.classを使いますから、これをjarにするにはMyFileFilter.classを含めてパックしなければ 動かなくなります。

GUIでのjarの実行では指定しないとエラーが表示されません。MyFileFilter.classを忘れるとダブルクリックしても何も起こらないということになります。

この様な時は次の様なコマンドをうつと分かるかもしれません。

$ tail ~/.xsession-errors 

こんなのが出てきたら、MyFileFilterがないと言っていると分かります。

Exception in thread "main" java.lang.NoClassDefFoundError: MyFileFilter
Exception in thread "main" java.lang.NoClassDefFoundError: MyFileFilter
Exception in thread "main" java.lang.NoClassDefFoundError: MyFileFilter
Exception in thread "main" java.lang.NoClassDefFoundError: MyFileFilter

いろいろ選べるようにする

ファイル名 SanTakuM.java

SanTakuF.java

public SanTakuF(){
	setDefaultCloseOperation(EXIT_ON_CLOSE); //終了処理を追加
	JFileChooser chooser = new JFileChooser("./");
	MyFileFilter filter = new MyFileFilter(".txt" , "テキストファイル(*.txt)");
	chooser.addChoosableFileFilter(filter);
	int retVal = chooser.showOpenDialog(this);

SanTakuM.java

public SanTakuS(){
	setDefaultCloseOperation(EXIT_ON_CLOSE); //終了処理を追加
	JFileChooser chooser = new JFileChooser("./");
	MyFileFilter[] filter = {
		new MyFileFilter(".java" , "Java ファイル(*.java)") ,
		new MyFileFilter(".class" , "class ファイル(*.class)") ,
		new MyFileFilter(".txt" , "テキストファイル(*.txt)")
	};
	for(int i = 0 ; i < filter.length ; i++){
		chooser.addChoosableFileFilter(filter[i]);
	}
	int retVal = chooser.showOpenDialog(this);

これはやってみただけで、java,classファイルを選んでも三択問題はできません

もくじ

聖愛高等学校
http://www.seiai.ed.jp/
Last Modified