如何将JFileChooser限制为自定义文件类型?

时间:2015-02-27 03:58:02

标签: java swing filechooser

JFileChooser我遇到了一些麻烦。我想限制只读取某种文件。使用FileNameExtensionFilter建议使用另一个堆栈答案,但这似乎不起作用。这可能是因为我必须将其限制为一个名为" battle"的自定义文件类型。文件。筛选器无法识别此文件类型,因为它不是常用的文件类型。我正在做的任务需要这个,因此我必须使用这种类型的文件。到达目录后,它不允许我选择文件。

以下是我的代码段:

public class battleship_window extends JFrame implements ActionListener{
JLabel loglabel;
JButton selectbutton;
JButton startbutton;
JLabel filename;
File file;
//JLabel scorearray[]=new JLabel[10];
char alphabet[]={'A','B','C','D','E','F','G','H','I','J'};
battleship_window()
{
    super("Battleship");
    setSize(1050,550);
    setLocation(50,200);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLayout(new BorderLayout());
    JPanel logpanel=new JPanel();
    makelogpanel(logpanel);
    this.add(logpanel,BorderLayout.SOUTH);

    this.setVisible(true);

}
public void makelogpanel(JPanel logpanel)
{
    loglabel=new JLabel("Log: You are now in edit mode, click to place your ships");
    selectbutton=new JButton("Select File");
    startbutton=new JButton("Start");
    startbutton.setEnabled(false);
    filename=new JLabel("File:");
    logpanel.setLayout(new BoxLayout(logpanel,BoxLayout.X_AXIS));
    logpanel.add(loglabel);
    logpanel.add(selectbutton);
    logpanel.add(filename);
    logpanel.add(startbutton);
    selectbutton.addActionListener(this);

}
public static void main(String [] args)
{
    battleship_window bw=new battleship_window();
}

public void actionPerformed(ActionEvent e)
{
    if(e.getSource()==selectbutton)
    {
        JFileChooser fileDialog=new JFileChooser();
        fileDialog.setAcceptAllFileFilterUsed(false);
        FileNameExtensionFilter filter = new FileNameExtensionFilter("Battle file", "battle");
        fileDialog.addChoosableFileFilter(filter);
        int returnVal = fileDialog.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
               file = fileDialog.getSelectedFile();
               filename.setText("File:" + file.getName());
        }

    }
}

}

我如何通过上述方法或任何其他方法实现这一目标? 请注意,代码编译并删除了我上面的一些代码,使其更具可读性,因此上述代码中可能存在一些语法错误。

3 个答案:

答案 0 :(得分:1)

不需要常用的文件类型来使用文件选择器进行重新定义。
只需创建一个文件并将其重命名为:

我的File.battle

然后浏览您的程序。它将显示该文件。

或尝试此代码:

JFileChooser fileDialog = new JFileChooser();
fileDialog.setAcceptAllFileFilterUsed(false);

int returnVal = fileDialog.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {            
    File file = fileDialog.getSelectedFile();

    if(file.getName().endsWith(".battle")){
        System.out.println("Selected file is battle file");
    }else{
        System.out.println("Invalied file type");
    }   
}

答案 1 :(得分:0)

我实际上有一个我正在编写的程序,它有多个JFileChooser,每个程序都要求只查找特定的文件类型。这个例子允许你有相同的想法,所以如果将来你需要允许不同的文件类型,你就可以开始了。我创建了一个扩展到FileFilter

的自定义类
public class CustomExtension extends FileFilter
{
    private String type;

    public CustomExtension(String type)
    {
        this.type = type;
    } 

    public Boolean accept(File file)
    {  
        if(file.isDirectory())
            return true;

        String ext = getExtension(file);
        if(ext == null)
            return false;

        switch(type)
        {
            case "battle":
                if(ext.equals("battle"))
                    return true;
                else 
                    break;
            default:
                System.out.println(type + " has not been set up in the switch statement yet");
        }

        return false;
    }

    public String getDescription()
    {
        switch(type)
        {
            case "battle":
                return "Only battle file supported";
        }
    }

    public String getExtension(File f)
    {
        String ext = null;
        String filename = f.getName();

        int i = filename.lastIndexOf('.');

        if(i > 0 && i < filename.length() - 1)
            ext = s.substring(i + 1).toLowerCase();

        return ext;
    }
}

我已经使用了一段时间了,我还没有注意到任何错误。要设置JFileChooser以便它使用此过滤器,您可以使用:

JFileChooser chooser = new JFileChooser();
chooser.setFileFilter(new CustomExtension("battle"));

现在你的JFileChooser只显示目录,以及以.battle结尾的文件

答案 2 :(得分:-1)

尝试使用

fileDialog.setFileFilter(new FileNameExtensionFilter("", "battle"));

而不是

fileDialog.addChoosableFileFilter(filter);

addChoosableFileFilter将添加到名为Files of Type的JFileChooser组合框中。