2012-05-09 1 views
8

В Windows Look and Feel для JFileChooser в левой части диалогового окна JFileChooser отображаются пять кнопок: «Недавние элементы», «Рабочий стол», «Мои документы», «Компьютер» и «Сеть». Каждый из них представляет собой представления файловой системы, которые Windows Explorer будет показывать им. Похоже, что JFileChooser по умолчанию использует представление «Мои документы», если не вызваны методы setSelectedFile() или setCurrentDirectory().Как сделать 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?

EDIT
Спасибо за быстрые и полные ответы. Я объединил ответы на 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")); 

ИЛИ

// set the file opener to look at the desktop  

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