Java でファイル タイプ フィルターを備えた FileDialog が必要
-
12-09-2019 - |
質問
ユーザーがファイルを選択するためのボタン/テキストフィールドを備えた JDialog があります。コードは次のとおりです。
FileDialog chooser = new FileDialog(this, "Save As", FileDialog.SAVE );
String startDir = saveAsField.getText().substring( 0, saveAsField.getText().lastIndexOf('\\') );
chooser.setDirectory(startDir);
chooser.setVisible(true);
String fileName = chooser.getFile();
私の問題は、「すべてのファイル」フィルターを表示する代わりに、カスタムフィルターを提供したいことです。Word ドキュメントなどの場合。setFilenameFilter() を使用してカスタム FilenameFilter をセットアップしましたが、機能しないようでした。ドキュメントには、カスタム フィルターは Windows では機能しない (これは Windows XP/Vista/7 で動作します) と記載されていることに気付きました。私のフィルタの実装は次のとおりです。
chooser.setFilenameFilter( new geFilter() );
public class geFilter implements FilenameFilter {
public boolean accept(File dir, String name) {
return name.endsWith( ".doc" ) || name.endsWith( ".docx" );
}
}
ここで私は何か間違ったことをしていますか?また、「Microsoft Word (*.doc *.docx)」のような説明をボックスに表示したいのですが、その方法がわかりません。
あらゆる助けをいただければ幸いです。
解決
AWTは本当にJavaのGUIは、これらの日アプリ書き込みの好ましい方法ではありません。 Sunは、主にそれを放棄しているようです。最も人気の高い2つのオプションは、SwingとSWT のです。だから私は、彼らが本当に現代的な機能を追加することは非常に広範囲のAPIを開発していなかったと思います。 (ERR、あなたの質問に答えるために:いいえ、あなたはAWTでそれを行うことができるように表示されません)
Swingはそれが本当に一度ランどこでも、書き込みされ、それはどこでもまったく同じに見えることができるという利点があります。一部は他よりも優れている、ルックアンドそれはSwingのルックネイティブを作ってみる感じがあります(Macはひどいではない、Windowsは大丈夫です、GTKではありません)。あなたが本当にどこでもまったく同じに見えると機能のアプリをしたい場合はそれでも、スイングは、あなたがそれを行うようになります。それに加えて、余分なライブラリなしでアウト・オブ・ボックスで実行されます。パフォーマンスが素晴らしいではありません。
Swingの JFileChooserののようになりますあなたがやりたいです。 するFileFilterするのサブクラスを作成します。そしてsetFileFilter
にJFileChooser
を呼び出します。
SWTは、追記型ランどこでも反対の極端にかかります。あなたはまだあなたが反対書く1つのコードベースを持っているが、それは一般的に(どこでも完璧な、まだ印象的ではない)は、ネイティブアプリのように見えるので、それは実際には、各プラットフォームのネイティブウィジェットを使用しています。これは、高速かつ私の経験ではかなり信頼性の高いです。 Eclipseの(および他の高プロファイルのソフトウェア)それはかなり重い使用中ですので、SWTを使用しています。しかし、それは、プラットフォーム固有のJARファイルとDLLが必要です。
他のヒント
JDialog を使用しているので、それはスイング クラスです。なぜ使用しないのですか JFileChooser?
JFileChooser fc = new JFileChooser("C:\\");
fc.setFileFilter(new FileNameExtensionFilter("Microsoft Word (*.doc, *.docx)", "doc", "docx"));
ファイル名拡張子フィルタ は、まさに必要なことを実行する優れた Java 6 クラスです。
私もそれをやろうとしています。私はのFileDialogの代わりのJFileChooserを使用したい。
私はここに答えが見つかりました: http://www.rgagnon.com/javadetails/ Javaの-0247.htmlする
彼が「勝利のプラットフォーム上で、setFilenameFilterメソッドは動作しません。私たちは、フィルタを設定する代わりに、setFileメソッドを使用しなければならない。」と述べている。
指定されたリンクのソースコードがあります。
私がテストし、それが動作します:
FileDialog fd = new FileDialog((Frame) null, "Save File", FileDialog.SAVE);
fd.setFile("*.txt");
fd.setVisible(true);
String file = fd.getFile();
System.out.println(file);
System.exit(0);
あなたはJNIでネイティブのWindowsのFileDialog(CFileDialogの)を呼び出すことができます。フィルタは簡単にCFileDialogのために設定することができます。
私は、あなたが興味を持っている場合は、
からソースおよびバイナリを取得することができ、数ヶ月前のCFileDialogのための単純なラッパークラスを書きましたXfiledialog Googleのコードの上のプロジェクト
あなたはのJavaFX 2 に使用する場合は、<のhref = "のhttp://ドキュメント。 oracle.com/javafx/2/api/javafx/stage/FileChooser.html」relが= 『nofollowを』>チューザのクラスでは、JFileChooserの/のFileDialogのいずれかの問題なしに必要な正確に何を行います。また、JavaFXのにSwingアプリケーション内の2つのコンポーネントを埋め込むことができますが、のJavaFXランタイムを必要とします>。
例:
FileChooser fc = new FileChooser();
FileChooser.ExtensionFilter filter;
filter = new FileChooser.ExtensionFilter("Text files (*.txt)", "*.txt");
fc.getExtensionFilters().add(filter);
File f = fc.showOpenDialog(primaryStage);
System.out.println(f);
ただ、setFilenameFilter
インスタンスFileDialog
のfd
メソッドを使用します:
fd.setFilenameFilter(new FilenameFilter()
{
@Override
public boolean accept(File file, String s)
{
// enter code to return TRUE or FALSE here
return s.contains(".txt");
}
});