我创建了一个 JFileChooser ,我想限制只能在 user.home 目录中使用它 >子文件夹。
我的JFileChooser的选择模式仅为目录。
到目前为止,我已经使用了这个:
//JButton select = new JButton();
final File directorylock = new File(System.getProperty("user.home"));
JFileChooser browse = new JFileChooser(directorylock);
browse.setFileView(new FileView() {
@Override
public Boolean isTraversable(File f) {
return directorylock.equals(f);
}
});
但是每次打开JFileChooser时,它只显示user.home目录没有它的子文件夹,因此我无法访问它们或选择它们。
它应该如何工作:打开JFileChooser并显示user.home目录及其所有子文件夹。能够访问子文件夹并选择它们。 不能够访问父文件夹。 user.home目录。
我希望有人知道这应该怎么做! :) 提前谢谢你们:D
答案 0 :(得分:3)
答案 1 :(得分:2)
请参考此示例,它可以正常工作,
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import javax.swing.*;
import javax.swing.filechooser.FileView;
public class JFileChooserExample {
private JFrame mainFrame;
private JLabel headerLabel;
private JLabel statusLabel;
private JPanel controlPanel;
public JFileChooserExample(){
prepareGUI();
}
public static void main(String[] args){
JFileChooserExample swingControlDemo = new JFileChooserExample();
swingControlDemo.showFileChooserDemo();
}
private void prepareGUI(){
mainFrame = new JFrame("Java Swing Examples");
mainFrame.setSize(400,400);
mainFrame.setLayout(new GridLayout(3, 1));
mainFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent windowEvent){
System.exit(0);
}
});
headerLabel = new JLabel("", JLabel.CENTER);
statusLabel = new JLabel("",JLabel.CENTER);
statusLabel.setSize(350,100);
controlPanel = new JPanel();
controlPanel.setLayout(new FlowLayout());
mainFrame.add(headerLabel);
mainFrame.add(controlPanel);
mainFrame.add(statusLabel);
mainFrame.setVisible(true);
}
private void showFileChooserDemo(){
headerLabel.setText("Control in action: JFileChooser");
final File directorylock = new File(System.getProperty("user.home"));
final JFileChooser fileDialog = new JFileChooser(directorylock);
fileDialog.setFileView(new FileView() {
@Override
public Boolean isTraversable(File f) {
return directorylock.equals(f);
}
});
JButton showFileDialogButton = new JButton("Open File");
showFileDialogButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int returnVal = fileDialog.showOpenDialog(mainFrame);
if (returnVal == JFileChooser.APPROVE_OPTION) {
java.io.File file = fileDialog.getSelectedFile();
statusLabel.setText("File Selected :"
+ file.getName());
}
else{
statusLabel.setText("Open command cancelled by user." );
}
}
});
controlPanel.add(showFileDialogButton);
mainFrame.setVisible(true);
}
}
输出:
答案 2 :(得分:2)
经过一些修改,我认为Vishal Gajera的解决方案可能有效。 我已经复制了来自tsauerwein的Check if file is in (sub)directory给出的方法
/**
* Checks, whether the child directory is a subdirectory of the base
* directory.
*
* @param base the base directory.
* @param child the suspected child directory.
* @return true, if the child is a subdirectory of the base directory.
* @throws IOException if an IOError occured during the test.
*/
public boolean isSubDirectory(File base, File child) {
boolean res = false;
try {
base = base.getCanonicalFile();
child = child.getCanonicalFile();
File parentFile = child;
while (!res && parentFile != null) {
if (base.equals(parentFile)) {
res = true;
}
parentFile = parentFile.getParentFile();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return res;
}
private void showFileChooserDemo(){
headerLabel.setText("Control in action: JFileChooser");
final File directorylock = new File(System.getProperty("user.home"));
final JFileChooser fileDialog = new JFileChooser(directorylock);
fileDialog.setFileView(new FileView() {
@Override
public Boolean isTraversable(File f) {
return isSubDirectory(directorylock, f);
}
});
JButton showFileDialogButton = new JButton("Open File");
showFileDialogButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int returnVal = fileDialog.showOpenDialog(mainFrame);
if (returnVal == JFileChooser.APPROVE_OPTION) {
java.io.File file = fileDialog.getSelectedFile();
statusLabel.setText("File Selected :"
+ file.getName());
}
else{
statusLabel.setText("Open command cancelled by user." );
}
}
});
controlPanel.add(showFileDialogButton);
mainFrame.setVisible(true);
}