Java7でAWTのFileDialogの挙動がおかしい

投稿日: 更新日:

Java7 u25での話です。
Java6では発生しません。

AWTのFileDialogを使用してファイルを選択すると
getDirectory()には、フォルダ名、
getFile()には、ファイル名が入るはずですが、

setFile()で「*bmp;*jpg;*jpeg;*wbmp;*png;*gif;*tga;*pict」と入れて、
ファイルの拡張子を固定するようにしたうえで、
短いファイルパスのファイルを選択すると、
次のように返すこととがあります。
getDirectory() → C:\Users\xxx\Documents\193.jpg
getFile()    → f;*tga;*pict

恐らく、setFile()で設定した長さの文字列より
短いファイルパスを選択するとバグるようです。

というわけで、なおるまで次のように回避します。

import java.awt.Dialog;
import java.awt.FileDialog;
import java.awt.Frame;
import java.io.File;

public class FileDialog2 extends FileDialog {

	public FileDialog2(Dialog paramDialog) {
		super(paramDialog);
	}

	public FileDialog2(Dialog paramDialog, String paramString) {
		super(paramDialog, paramString);
	}

	public FileDialog2(Dialog paramDialog, String paramString, int paramInt) {
		super(paramDialog, paramString, paramInt);
	}

	public FileDialog2(Frame paramFrame) {
		super(paramFrame);
	}

	public FileDialog2(Frame paramFrame, String paramString) {
		super(paramFrame, paramString);
	}

	public FileDialog2(Frame paramFrame, String paramString, int paramInt) {
		super(paramFrame, paramString, paramInt);
	}

	public String getDirectory() {
		String dir = super.getDirectory();
		if(dir == null) {
			return(null);
		}
		File f = new File(dir);
		if(f.isDirectory()) {
			return(dir);
		}
		else {
			return(f.getParent() + "\\");
		}
	}

	public String getFile() {
		String file = super.getFile();
		if(file == null) {
			return(null);
		}
		File f = new File(super.getDirectory());
		if(f.isDirectory()) {
			return(super.getFile());
		}
		else {
			return(f.getName());
		}
	}

}


追記
そもそもJava7だと、
setFileによるフィルタリングが機能していないようです。

広告

コメントをどうぞ(承認された後に公開されます。メールアドレスの記入は自由ですが、記入した場合でも一般公開されることはありません)

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中