私はプログラムにJFileChooser
を入れていますが、それは画像しか取りません。だから私はフィルターを追加することにしました:
import javax.swing.*;
public class fileChooser {
public static void main(String[] args) {
JPanel panel = new JPanel();
final JFileChooser fc = new JFileChooser();
int file = fc.showOpenDialog(panel);
fc.addChoosableFileFilter(new ImageFilter());
fc.setAcceptAllFileFilterUsed(false);
}
}
私はJavaチュートリアルから直接それを得ました。しかし、Eclipseはエラーとして以下を強調しています:
fc.addChoosableFileFilter(new ImageFilter());
fc.setAcceptAllFileFilterUsed(false);
助言がありますか?
私はJFileChooserをプログラムに入れていますが、それは画像しか取りません。
そのOSでそのJREによってサポートされているタイプのリストを表示するには、 ImageIO
を使用します。
FileFilter imageFilter = new FileNameExtensionFilter(
"Image files", ImageIO.getReaderFileSuffixes());
bmp
jpg
jpeg
wbmp
png
gif
注:そのリストをハードコーディングしないでください!バージョンやOSによって異なる場合があります。例えば。
jai がインストールされている場合、そのリストにはさらに多くのフォーマットがあります。
fc.addChoosableFileFilter()
の引数はjavax.swing.filechooser.FileFilter
のサブクラスである必要があります。たとえば、次のようにコードを変更できます。
fc.addChoosableFileFilter(new FileNameExtensionFilter("Image Files", "jpg", "png", "tif");
私はsetFileFilter()を使用しています。
私のコードは以下です(Java-JSE 1.6)
JFileChooser c = new JFileChooser();
//Setting Up The Filter
FileFilter imageFilter = new FileNameExtensionFilter(
"Image files", ImageIO.getReaderFileSuffixes());
//Attaching Filter to JFileChooser object
c.setFileFilter(imageFilter);
//Displaying Filechooser
int rVal = c.showOpenDialog(new JPanel());
間違ったImageFilerクラスを使用しています:-)
チュートリアルのImageFilterは、インポートするJava.awtパッケージからのものではありません。このImageFilterはjavax.swing.filechooser.FileFilterを実装する必要があります。
チュートリアルで定義されている他のImageFilterクラスがあるかどうかを確認し、それを使用してください。
適切なfilefilterの例:
new JFileChooser().addChoosableFileFilter(new FileFilter() {
@Override
public boolean accept(File f) {
// TODO Auto-generated method stub
return f.getName().endsWith(".jpg");
}
@Override
public String getDescription() {
return "JPEG files";
}
});
FileFilter
クラスを使用してから、setFileFilter()
を使用できます
class ImageFilter extends FileFilter {
@Override
public boolean accept(File pathname) {
String filename = pathname.getName();
if (pathname.isDirectory()) {
return true;
} else if (filename.endsWith("jpg'") || filename.endsWith("jpeg") || filename.endsWith("png") || filename.endsWith("gif")) {
return true;
} else {
return false;
}
}
今あなたのメインクラスで:
fc.setFileFilter(new ImageFilter());
受け入れられた回答(ImageIO.getReaderFileSuffixes()でFileNameExtensionFilterを使用)にはいくつかの問題があります。
私のシステム(Ubuntuのjdk1.8.0_192)では、ImageIO.getReaderFileSuffixes()は次のような配列を返します。
[, jpg, tiff, bmp, pcx, gif, png, ppm, tif, pgm, wbmp, jpeg, pbm]
最初の空の文字列に注意してください。この文字列はFileNameExtensionFilterでは無効です。
IllegalArgumentException: Each extension must be non-null and not empty
これに対する解決策は、空の文字列を削除することです-Apache commons-langを使用:
String[] extensions = ArrayUtils.removeAllOccurences(ImageIO.getReaderFileSuffixes(), "");
FileFilter filter = new FileNameExtensionFilter("Images", extensions);
余談ですが、openjdkバージョン "11.0.2"の同じシステム上で2019-01-15私はこれらの拡張機能を取得します:
[jpg, tif, tiff, bmp, gif, png, wbmp, jpeg]