2012-05-09 13 views
8

W oknie Wygląd i działanie systemu JFileChooser po lewej stronie okna dialogowego JFileChooser wyświetlanych jest pięć przycisków: Ostatnie elementy, Komputer, Moje dokumenty, Komputer i Sieć. Każda z nich reprezentuje widoki systemu plików, tak jak pokazywałby to Eksplorator Windows. Wygląda na to, że JFileChooser domyślnie wyświetla widok Moich Dokumentów, chyba że wywoływane są metody setSelectedFile() lub setCurrentDirectory().Jak ustawić domyślny widok pliku JFileChooser na widok komputera zamiast Moich dokumentów

Próbuję ułatwić użytkownikowi wybór jednego z wielu zmapowanych dysków sieciowych, które powinny pojawić się w widoku "Komputer". Czy istnieje sposób ustawienia JFileChooser, aby domyślnie otwierał widok "Komputer"?

Próbowałem kilka metod wymusić go, najnowsze jest znaleźć katalog główny i ustawić go jako currentDirectory, ale to pokazuje zawartość tego węzła głównego. Najnowszy kod znajduje się poniżej.

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(); 

      } 
     } 
    } 

Czy istnieje metoda, która pozwala mi wybrać „Computer” Widok Domyślnie (lub sieci lub dowolny inny pogląd), lub jakikolwiek sposób oszukać JFileChooser?

EDYTOWANIE
Dziękuję za szybkie i dokładne odpowiedzi. Połączyłem odpowiedzi Hovercraft Full Of Eels i Guillaume Polet, aby spróbować, aby kod działał na dowolnej liście dysków. Wynikowy kod jest następujący. Jeszcze raz, dzięki.

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(); 

      } 
     } 
    } 

Odpowiedz

7

Oto działający przykład. Zakłada, że ​​C: \ jest prawidłową ścieżką. Używa 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+ i ditto, to też działa dobrze. –

4

kludge sposobem na to jest, aby rodzic Domyślnym katalogiem jest aż toString() pliku otrzymany „Komputer”. coś w stylu:

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: że działa zbyt –

+3

Właśnie się dowiedziałem, że '' FileSystemView' ma isComputerNode (Plik) 'metody, która byłaby czystsza niż porównywanie ciągów. –

+1

@GuillaumePolet: Próbowałem go używać, ale nie działało: 'if (defaultFile! = Null && fsv.isComputerNode (defaultFile)) {' –

0
//Specify the absolute path of the Mapped Drive 

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

LUB

// set the file opener to look at the desktop  

JFileChooser chooser = new JFileChooser();   
chooser.setCurrentDirectory(new File(System.getProperty("user.home") + "\\Desktop")); 
Powiązane problemy