JFileChooser 和 eclipse
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13743601/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JFileChooser and eclipse
提问by M_x_r
I am looking for a way to have JFileChooser allow the user to choose from txt files that are included in the bin file of eclipse project only. Is there a way to have the JFileChooser pop up and display a selected number of txt files that reside with in the bin folder?
我正在寻找一种方法让 JFileChooser 允许用户从仅包含在 eclipse 项目的 bin 文件中的 txt 文件中进行选择。有没有办法让 JFileChooser 弹出并显示位于 bin 文件夹中的选定数量的 txt 文件?
回答by Nikolay Kuznetsov
You can refer to the following code, just specify absolute or relative path to your folder/dir
您可以参考以下代码,只需指定文件夹/目录的绝对或相对路径
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"TXT files", "txt");
chooser.setFileFilter(filter);
chooser.setCurrentDirectory("<YOUR DIR COMES HERE>");
int returnVal = chooser.showOpenDialog(parent);
if(returnVal == JFileChooser.APPROVE_OPTION) {
System.out.println("You chose to open this file: " +
chooser.getSelectedFile().getName());
}
回答by David Kroukamp
So you only want to display certain text files in the directory?
所以你只想显示目录中的某些文本文件?
Use a FileFilter
which will check the files name against an ArrayList
of file names if a match is found it will return true
which will allow JFileChooser
to show file
如果找到匹配项,则使用FileFilter
将根据文件名检查文件名ArrayList
,它将返回true
,这将允许JFileChooser
显示文件
Something like:
就像是:
JFileChooser fc=..;
fc.setCurrentDirectory(new File("path/to/bin/"));//put path to bin here
....
ArrayList<String> filesToSee=new ArrayList<>();
//add names of files we want to be visible to user of JFileChooser
filesToSee.add("file1.txt");
filesToSee.add("file2.txt");
fc.addChoosableFileFilter(new MyFileFilter(filesToSee));
//By default, the list of user-choosable filters includes the Accept All filter, which enables the user to see all non-hidden files. This example uses the following code to disable the Accept All filter:
fc.setAcceptAllFileFilterUsed(false);
....
class MyFileFilter extends FileFilter {
private ArrayList<String> files;
public MyFileFilter(ArrayList<String> files) {
this.files=files;
}
//Accept only files in passed array
public boolean accept(File f) {
for(String s:files) {
if(f.getName().equals(s)) {
return true;
}
}
return false;
}
//The description of this filter
public String getDescription() {
return "Specific Files";
}
}
Reference:
参考:
回答by Guillaume Polet
Another way to do it is to implement the FileSystemView so that it only shows your directory and prevent from going upper in the hierarchy or other "drives".
另一种方法是实现 FileSystemView 以便它只显示您的目录并防止进入层次结构或其他“驱动器”的上层。
Here is a demo of such a FileSystemView. All you have to provide in input is the root directory (ie, the path to your bin, probably something such as new File("bin")
if the working dir is considered to be the root of your Eclipse project which is what Eclipse does by default).
这是此类 FileSystemView 的演示。您必须在输入中提供的只是根目录(即,您的 bin 的路径,可能例如new File("bin")
工作目录是否被视为 Eclipse 项目的根目录,这是 Eclipse 默认情况下所做的)。
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.filechooser.FileSystemView;
public class TestJFileChooser2 {
public static class MyFileSystemView extends FileSystemView {
private File root;
public MyFileSystemView(File root) {
super();
try {
this.root = root.getCanonicalFile();
} catch (IOException e) {
this.root = root;
}
}
@Override
public File[] getRoots() {
return new File[] { root };
}
@Override
public File createNewFolder(File containingDir) throws IOException {
return FileSystemView.getFileSystemView().createNewFolder(containingDir);
}
@Override
public File createFileObject(String path) {
File file = super.createFileObject(path);
if (isEmbedded(file)) {
return file;
} else {
return root;
}
}
@Override
public File createFileObject(File dir, String filename) {
if (isEmbedded(dir)) {
return super.createFileObject(dir, filename);
} else {
return root;
}
}
@Override
public File getDefaultDirectory() {
return root;
}
private boolean isEmbedded(File file) {
while (file != null && !file.equals(root)) {
file = file.getParentFile();
}
return file != null;
}
@Override
public File getParentDirectory(File dir) {
File parent = dir.getParentFile();
if (isEmbedded(parent)) {
return parent;
} else {
return root;
}
}
}
protected void initUI() {
JFrame frame = new JFrame("Test file chooser");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JButton ok = new JButton("Click me to select file");
ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
final JFileChooser openFC = new JFileChooser(new MyFileSystemView(new File("")));
openFC.setDialogType(JFileChooser.OPEN_DIALOG);
// Configure some more here
openFC.showDialog(ok, null);
}
});
}
});
frame.add(ok);
frame.setBounds(100, 100, 300, 200);
frame.setVisible(true);
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestJFileChooser2().initUI();
}
});
}
}