如何将 JFileChooser 限制为自定义文件类型?
How to restrict a JFileChooser to a custom file type?
我在使用 JFileChooser
时遇到了一些小问题。我想限制只读取某些类型的文件。 Another stack answer recommended using a 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
将添加到名为 Files of Type
的 JFileChooser 组合框中。
我目前正在编写的程序有多个 JFileChooser,每个 JFileChooser 只需要查找特定的文件类型。这个例子会让你有同样的想法,所以如果将来你需要允许不同的文件类型,你就可以开始了。我创建了一个扩展到 FileFilter
的自定义 class
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 结尾的文件
使用文件选择器注册不需要常用的文件类型。
只需创建一个文件并将其重命名为:
"我的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");
}
}
我在使用 JFileChooser
时遇到了一些小问题。我想限制只读取某些类型的文件。 Another stack answer recommended using a 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
将添加到名为 Files of Type
的 JFileChooser 组合框中。
我目前正在编写的程序有多个 JFileChooser,每个 JFileChooser 只需要查找特定的文件类型。这个例子会让你有同样的想法,所以如果将来你需要允许不同的文件类型,你就可以开始了。我创建了一个扩展到 FileFilter
的自定义 classpublic 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 结尾的文件
使用文件选择器注册不需要常用的文件类型。
只需创建一个文件并将其重命名为:
"我的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");
}
}