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());
}
}
}
}
我如何通过上述方法或任何其他方法实现这一目标? 请注意,代码编译并删除了我上面的一些代码,使其更具可读性,因此上述代码中可能存在一些语法错误。
答案 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组合框中。