我遇到了一些小问题JFileChooser
。我想限制只读取某些类型的文件。另一个堆栈答案建议使用FileNameExtensionFilter
,但这似乎不起作用。这可能是因为我必须将其限制为称为“战斗”文件的自定义文件类型。过滤器无法识别此文件类型,因为它不是常用的文件类型。我正在做的作业需要这个,因此我必须使用这种类型的文件。到达目录后,它不允许我选择文件。
以下是我的代码片段:
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());
}
}
}
}
我怎样才能通过上述方法或任何其他方法实现这一目标?
请注意,代码会编译,并且我删除了上面的一些代码以使其更具可读性,因此上面的代码中可能存在一些语法错误。
实际上,我现在正在编写一个程序,其中有多个 JFileChooser,每个 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 结尾的文件
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)