2012-05-09 27 views
8

在JFileChooser的Windows外觀中,JFileChooser對話框的左側顯示五個按鈕:最近項目,桌面,我的文檔,計算機和網絡。這些代表Windows資源管理器將顯示文件系統的視圖。看起來,除非調用setSelectedFile()或setCurrentDirectory()方法,否則JFileChooser默認爲My Documents View。如何使JFileChooser默認爲計算機視圖而不是我的文檔

我試圖讓用戶選擇一個映射網絡驅動器,它應該出現在「計算機」視圖中。有沒有辦法設置JFileChooser默認打開「計算機」視圖?

我已經嘗試了幾種方法來強制它,最近找到根目錄並將其設置爲currentDirectory,但這顯示了該根節點的內容。最近的代碼包含在下面。

private File originalServerRoot; 
private class SelectOriginalUnitServerDriveListener implements ActionListener 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      JFileChooser origDriveChooser = new JFileChooser(); 
      origDriveChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
      File startFile = new File(System.getProperty("user.dir")); //Get the current directory 

      // Find System Root 
      while (!FileSystemView.getFileSystemView().isFileSystemRoot(startFile)) 
      { 
       startFile = startFile.getParentFile(); 
      } 

      origDriveChooser.setCurrentDirectory(startFile); 
      origDriveChooser.setDialogTitle("Select the Mapped Network Drive"); 
      int origDriveChooserRetVal = origDriveChooser.showDialog(contentPane,"Open"); 
      if (origDriveChooserRetVal == JFileChooser.APPROVE_OPTION) 
      { 
       originalUnitServerRoot = origDriveChooser.getSelectedFile(); 

      } 
     } 
    } 

有沒有可以讓我選擇默認的「計算機」視圖(或網絡,或任何其他視圖)的方法,或以任何方式欺騙JFileChooser中?

編輯
感謝您的快速和徹底的答案。我將Hovercraft Full Of Eels和Guillaume Polet的答案結合起來,嘗試使代碼在任何驅動器盤符上運行。結果代碼如下。再一次,謝謝。

private File originalServerRoot; 
private class SelectOriginalUnitServerDriveListener implements ActionListener 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      JFileChooser origDriveChooser = new JFileChooser(); 
      origDriveChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
      File startFile = new File(System.getProperty("user.dir")); //Get the current directory 

      // Find System Root 
      while (!FileSystemView.getFileSystemView().isFileSystemRoot(startFile)) 
      { 
       startFile = startFile.getParentFile(); 
      } 
      //Changed the next line 
      origDriveChooser.setCurrentDirectory(origDriveChooser.getFileSystemView().getParentDirectory(rootFile)); 
      origDriveChooser.setDialogTitle("Select the Mapped Network Drive"); 
      int origDriveChooserRetVal = origDriveChooser.showDialog(contentPane,"Open"); 
      if (origDriveChooserRetVal == JFileChooser.APPROVE_OPTION) 
      { 
       originalUnitServerRoot = origDriveChooser.getSelectedFile(); 

      } 
     } 
    } 

回答

7

這是一個工作示例。它使得C:\是一個有效的路徑。它使用FileSystemView.getParentDir(File)

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 

import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Test { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Test().initUI(); 
      } 
     }); 
    } 

    protected void initUI() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(); 
     final JButton button = new JButton("Select files..."); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       final JFileChooser chooser = new JFileChooser(); 
       chooser.setCurrentDirectory(
           chooser.getFileSystemView().getParentDirectory(
            new File("C:\\"))); 
          chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
       chooser.showDialog(button, "Select file"); 
      } 
     }); 
     panel.add(button); 
     frame.add(panel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

1+和同上,這也很好。 –

4

一個雜牌的方式來做到這一點是得到默認的目錄的父目錄,直至獲得文件的toString()是「電腦」。例如:

FileSystemView fsv = FileSystemView.getFileSystemView(); 
    File defaultFile = fsv.getDefaultDirectory(); 
    while (defaultFile != null) { 
    defaultFile = defaultFile.getParentFile(); 
    if (defaultFile != null && "Computer".equalsIgnoreCase(defaultFile.toString())) { 
     JFileChooser fileChooser = new JFileChooser(defaultFile); 
     fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
     int result = fileChooser.showOpenDialog(null); 
     if (result == JFileChooser.APPROVE_OPTION) { 
      File file = fileChooser.getSelectedFile(); 
      System.out.println(file); 
     } 
    } 
    } 
+0

+1:該作品太 –

+3

我剛發現'FileSystemView'有一個'isComputerNode(文件)'方法,這比清潔劑比較字符串。 –

+1

@GuillaumePolet:我試過使用它,但它不起作用:'if(defaultFile!= null && fsv.isComputerNode(defaultFile)){' –

0
//Specify the absolute path of the Mapped Drive 

chooser.setCurrentDirectory(new File("B:\\exampleFolder")); 

OR

// set the file opener to look at the desktop  

JFileChooser chooser = new JFileChooser();   
chooser.setCurrentDirectory(new File(System.getProperty("user.home") + "\\Desktop")); 
相關問題