Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将JFileChooser限制为自定义文件类型?_Java_Swing_Filechooser - Fatal编程技术网

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

Java 如何将JFileChooser限制为自定义文件类型?,java,swing,filechooser,Java,Swing,Filechooser,我在使用JFileChooser时遇到了一些小问题。我想限制只读取某些类型的文件。另一个堆栈答案建议使用FileNameExtensionFilter,但这似乎不起作用。这可能是因为我必须将其限制为称为“battle”文件的自定义文件类型。筛选器无法识别此文件类型,因为它不是常用的文件类型。我正在做的作业需要这个,因此我必须使用这种类型的文件。到达目录时,它不允许我选择文件 以下是我的代码片段: public class battleship_window extends JFrame impl

我在使用
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());
        }

    }
}
}

我如何通过上述方法或任何其他方法实现这一点? 请注意,代码是经过编译的,我对上面的一些代码进行了深入研究,以使其更具可读性,因此上面的代码中可能存在一些语法错误

尝试使用

fileDialog.setFileFilter(new FileNameExtensionFilter("", "battle"));
而不是

fileDialog.addChoosableFileFilter(filter);

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

我目前正在编写一个程序,其中有多个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将只显示目录和以.battle结尾的文件。使用file chooser注册时,不需要使用常用的文件类型。
只需创建一个文件并使用扩展名将其重命名为:

我的文件.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");
    }   
}

battle
是该文件的扩展名吗?像
Big.battle
?是的,battle是扩展名,所以举个例子,我试图起诉myfile.battle对我来说很好。考虑提供一个说明你的问题的方法。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将减少混乱和更好的回答让我用整个代码编辑问题。问题是JFileChooser会打开,但当我进入一个带有battle文件的目录时,它并没有将其设置为可选。您的代码片段对我来说很好…尽管布局很糟糕…所做的只是使对话框中的过滤器显示为空…我能理解为什么这个答案被否决吗?不是否决者,但是,这不行anything@MadProgrammer你能解释一下为什么它什么都不起作用吗?被接受的答案在其答案的底部也提出了同样的建议。
setFileFilter
addchoosablefilter
是两个不同的东西。
addchoosablefilter
只是将该过滤器添加到组合框中以选择所需的过滤器,而
setFileFilter
将只显示以
.battle
结尾的目录和文件,因为没有可识别的问题。OP发布的每一段代码都有效,将
FileNameExtensionFilter
应用到
setFileFilter
是毫无意义的,因为它与
addchoosablefilter
的工作相同,它只是给用户增加了更多的控制权……没有一个答案能够真正回答问题,因为OP不能给出一个例子来说明这些问题,因此,我们无缘无故地提出了毫无意义的黑客攻击,这对OP或任何其他可能在寻找类似问题答案的人都没有帮助
JFileChooser
完全能够在对话框返回之前提供输入后验证,这就是文件对话框的要点…你刚刚删除了这个用户功能,给用户带来了一定程度的麻烦…@MadProgrammer-我知道。他的代码也在工作。我只是展示了另一种过滤文件的方法。但这可能是最糟糕的方法之一。
JFileChooser
有两种机制提供过滤功能。您的解决方案可能需要添加一个
do-while
循环,以不断提示用户输入另一个
文件
,直到计算出接受的内容。当然,您已经向他们展示了一种“不同”的方式,但这会降低程序的可用性,并让用户感到烦恼,尤其是当有更好的方式来实现所需的结果时。我仍在等待OP实际提供一个可运行的示例来演示这一问题,因为他们提供的所有代码都可以像isSo一样正常工作,与执行相同任务的
FileNameExtensionFilter
相比,这有什么好处呢?我记得当我查找如何限制文件类型时,我指的是(包括为您的利益siddhant的链接,如果您没有看到它,它是非常有用的)。我相信我可能需要一些自定义功能,或者对一些输出消息进行多一点控制,但老实说,确切的原因我已经忘记了。
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");
    }   
}