web-dev-qa-db-ja.com

JFileChooserフィルター

私はプログラムに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);

助言がありますか?

18
user1832583

私はJFileChooserをプログラムに入れていますが、それは画像しか取りません。

そのOSでそのJREによってサポートされているタイプのリストを表示するには、 ImageIO を使用します。

FileFilter imageFilter = new FileNameExtensionFilter(
    "Image files", ImageIO.getReaderFileSuffixes());

見られるタイプ-Java 1.6/Windows 7

bmp
jpg
jpeg
wbmp
png
gif

注:そのリストをハードコーディングしないでください!バージョンやOSによって異なる場合があります。例えば。

  1. WindowsがBMPをロードするためのサポートを備えていることに驚いていませんが、それはMacで起こりますか?
  2. [〜#〜] wbmp [〜#〜] を見ると、そのような形式の存在を警告されました!

jai がインストールされている場合、そのリストにはさらに多くのフォーマットがあります。

チューザーに表示されるフィルター

Image Chooser

28
Andrew Thompson

fc.addChoosableFileFilter()の引数はjavax.swing.filechooser.FileFilterのサブクラスである必要があります。たとえば、次のようにコードを変更できます。

fc.addChoosableFileFilter(new FileNameExtensionFilter("Image Files", "jpg", "png", "tif");
7
mazaneicha

私は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());
5
user2377528

間違った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";
        }

    });
2
Pawel Solarski

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());
1
bhavna garg

受け入れられた回答(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]
1
Shyrtol