2011-01-28 4 views
5

イメージファイルのみを選択できるファイルトゥーザーでファイルをフィルタリングする必要があります。私はいただきました!ここに私のコードで間違って把握するように見えるカント:JFileChooserでカスタムFileFilterを使用する

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.awt.image.ImageFilter; 
import java.io.File; 
import java.io.FileFilter; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 


public class Viewer extends JFrame implements ActionListener{ 
/** 
    * 
    */ 
private static final long serialVersionUID = 1L; 

private JMenuItem open; 
private JMenuItem exit; 
private JFileChooser fileChooser; 
private JLabel image; 

public Viewer(){ 
    super("Picture Viewer"); 
    this.setLayout(new BorderLayout()); 
    //this.setSize(400, 400); 

    JPanel canvas = new JPanel(); 
    this.add(canvas, BorderLayout.CENTER); 
    image = new JLabel(); 
    canvas.add(image, BorderLayout.CENTER); 

    JMenuBar menubar = new JMenuBar(); 
    this.add(menubar, BorderLayout.NORTH); 
    JMenu menu = new JMenu("File"); 
    menubar.add(menu); 
    open = new JMenuItem("Open..."); 
    open.addActionListener(this); 
    menu.add(open); 
    exit = new JMenuItem("Exit"); 
    exit.addActionListener(this); 
    menu.add(exit); 

    this.setVisible(true); 
    this.pack(); 
} 

public void actionPerformed(ActionEvent e){ 
    if(e.getSource() == open){ 
    fileChooser = new JFileChooser(); 
    fileChooser.showOpenDialog(this); 
    fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
    fileChooser.setFileFilter(new ImageFileFilter()); 

    int returnVal = fileChooser.showOpenDialog(null); 
      if(returnVal == JFileChooser.APPROVE_OPTION) { 
       File file = fileChooser.getSelectedFile(); 
       // bmp, gif, jpg, png files okay 
       BufferedImage bi; 
    try { 
     bi = ImageIO.read(file); 
       image.setIcon(new ImageIcon(bi)); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
       // catch IOException 
      } 
     this.pack(); 
    } 
    else if(e.getSource() == exit){ 
    System.exit(0); 
    } 
} 

public static void main(String[] args){ 
    Viewer viewer = new Viewer(); 
} 
public class ImageFileFilter implements FileFilter{ 
    private final String[] okFileExtensions = 
    new String[] {"jpg", "png", "gif", "bmp"}; 

    public boolean accept(File file) 
    { 
    for (String extension : okFileExtensions) 
    { 
     if (file.getName().toLowerCase().endsWith(extension)) 
     { 
     return true; 
     } 
    } 
    return false; 
    } 
} 
} 

それは型のFileFilterのFileFilterのありえないを実装して、私のカスタムフィルタクラスと私に言っています。 :/

答えて

3

のインスタンスがjavax.swing.filechooser.FileFilterになるようにJFileChooserが必要です。 を実装しているため、IDEはjava.io.FileFilterを代わりにインポートしています。

+0

ありがとう、私はそれをやったが、今では動作しますが、ディレクトリは私のファイルチョイス中の「ドキュメント」ですので、明らかにイメージはありません。別のディレクトリに移動しようとすると、表示されません。ファイルチューザが開いたら、どのようにデフォルトのディレクトリを作成して、「ピクチャ」フォルダに設定できますか? –

+0

JFileChooserのsetCurrentDirectoryメソッドを使用します。フィルタがすべての可能なファイルを拒否するだけではないと確信していますか?私はテストするためにacceptメソッドにブレークポイントを設定します。 – Pace

+0

これは私があまりにも払ったものです。 – ncmathsadist

3

あなたのファイルフィルタもディレクトリを受け入れる必要があります。

if (file.isDirectory()) 
    return true; 

でも、ファイル選択モードはファイルのみです(これは正しい)。

2

Java7以降、FileFilterのサブクラス化ではなく、単にFileNameExtensionFilter(String description, String... extensions)を使用することができます。

例に、単純なJFileChooserのアナログは、次のようになります。

JFileChooser fileChooser = new JFileChooser(); 
fileChooser.setFileFilter(new FileNameExtensionFilter("Image files", "jpg", "png", "gif", "bmp")); 

私は疑問がずっと前に答え​​た知っているが、これは実際には最も簡単な解決策です。

関連する問題