JFileChooser.SetCurrentDirectory не работает - PullRequest
0 голосов
/ 14 марта 2019

У меня есть JFileChooser, и я хочу установить каталог, который он открывает, используя некоторую информацию, хранящуюся в файле .txt (я использую файл .txt, чтобы сохранить желаемое местоположение между сеансами).Я могу получить файл, прочитать данные и установить его в строку, но когда я пытаюсь использовать эту строку для установки каталога, который я хочу открыть, он не работает.Мой код выглядит примерно так:

//buffer contains a byte[] for "/Users/user/Documents/Work/folderToOpen" desiredPath = new String(buffer); jFileChooser1.setCurrentDirectory(new java.io.File(desiredPath));

Однако, пройдя через это, текущий каталог устанавливается в /Users/user.

Если у кого-то естьЛюбые идеи о том, что я делаю не так или лучший способ сделать это, я хотел бы услышать это.

Спасибо

private static String LAST_FOLDER_USED = null;

//Get the desired file path for user preferences
String pluginRoot = System.getProperty("user.dir") + File.separator.toString();
//Create a file using the desired file Path
File userPreferences = new File(pluginRoot + File.separator + "UserPreferences.txt");

//Get a file called UserPreferences.txt from target/classes to create an input stream
String fileName = "UserPreferences.txt";
InputStream readInFile = getClass().getResourceAsStream(fileName);{

//Convert input stream to read from the desired file in the plug-in root ("filePath" Created Above)
  try{
    readInFile = new FileInputStream(userPreferences);
  }
  catch (IOException e){
    e.printStackTrace();
  }}

//Read the readInFile into a byte[]
String desiredPathToOpenImage;
byte[] buffer = new byte[1000];

int i = 0;{
try {
  while((i = readInFile.read(buffer)) !=-1){
        System.out.println(new String(buffer));
        i++;
}} 
catch (IOException e) {
    e.printStackTrace();
};
//Convert byte[] to string (This should be the path to the desired folder when selecting an image)
desiredPathToOpenImage = new String(buffer);
}

//Create a New File using the desired path
File desiredPath = new File(desiredPathToOpenImage + File.separator + "prefs.txt");

public SelectImage(Viewer parent, boolean modal) {
  super(parent, modal);
  initComponents();
  int returnVal = jFileChooser1.showOpenDialog(parent);
 // Sets up arrays for storing file information to be passed back to the viewer class.
  String[] filePath = new String[jFileChooser1.getSelectedFiles().length];
  String[] fileName = new String[jFileChooser1.getSelectedFiles().length];
  String[] fileDir = new String[jFileChooser1.getSelectedFiles().length];
  if (returnVal == JFileChooser.APPROVE_OPTION) {
   // Cycles through the selected files and stores each piece accordingly
   for (int i = 0; i < jFileChooser1.getSelectedFiles().length; i++) {
    File file = jFileChooser1.getSelectedFiles()[i];
    filePath[i] = file.getPath();
    fileName[i] = file.getName();
    fileDir[i] = file.getParent();
  }

 }
 parent.setFilePath(filePath, fileName, fileDir);

}

private void initComponents() {

 jFileChooser1 = new javax.swing.JFileChooser();

setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
jFileChooser1.setMultiSelectionEnabled(true);
      //Checks folder_Path to see if a value is present. If value is present sets jFileChooser Directory to that value
        if(desiredPathToOpenImage.contains(File.separator)){
            //Create a File using the desired path for selecting images
       //****Currently doesn't set the Directory correctly****//
            jFileChooser1.setCurrentDirectory(desiredPath);
        }
      //If no value is present in LAST_FOLDER_USED sets jFileChooser Directory to desktop
        else{
            jFileChooser1.setCurrentDirectory(new java.io.File("/Users/benwoodruff/Desktop"));
        }
jFileChooser1.addActionListener(new java.awt.event.ActionListener() {
  public void actionPerformed(java.awt.event.ActionEvent evt) {
    jFileChooser1ActionPerformed(evt);

//After file is selected sets value of LAST_FOLDER_USED to the absolute path of that file
    LAST_FOLDER_USED = jFileChooser1.getCurrentDirectory().toString() + File.separator + "UserPreferences.txt";        

    try {
        FileWriter fileWriter = new FileWriter(userPreferences);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

        bufferedWriter.write(jFileChooser1.getCurrentDirectory().toString());
        OutputStream outPut = new FileOutputStream(pluginRoot +    File.separator + "UserPreferences.txt");
        outPut.write(LAST_FOLDER_USED.getBytes());
        outPut.close();

        bufferedWriter.close();
    } catch (IOException e) {
        System.out.println("Error Writing to File" + desiredPathToOpenImage);
        e.printStackTrace();
    }     

  }
});

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Нашел лучший способ для достижения моей цели, используя Preferences вместо попытки создания и доступа к файлам для сохранения местоположения.

Preferences prefs = Preferences.userNodeForPackage(this.getClass());
static String LAST_FOLDER_USED = "LAST_FOLDER_USED";
String folder_Location;

, а затем внутри initComponents ()

 if(LAST_FOLDER_USED != null){
            jFileChooser1.setCurrentDirectory(new File(prefs.get(LAST_FOLDER_USED, LAST_FOLDER_USED)));
        }
        else{
            jFileChooser1.setCurrentDirectory(new java.io.File("/Users/benwoodruff/Desktop"));
        }
jFileChooser1.addActionListener(new java.awt.event.ActionListener() {
  public void actionPerformed(java.awt.event.ActionEvent evt) {
    jFileChooser1ActionPerformed(evt);

    folder_Location = jFileChooser1.getCurrentDirectory().toString();
    prefs.put(LAST_FOLDER_USED, folder_Location);
    //System.out.println(prefs.get(LAST_FOLDER_USED, folder_Location));
  }
});
0 голосов
/ 16 марта 2019

Я думаю, что каталог, переданный в качестве аргумента, не существует или недоступен для пользователя, в который вы вошли, судя по javadoc setCurrentDirectory ():

Если файл, переданный в качестве currentDirectory, не является каталогом, родительский файл будет использоваться в качестве currentDirectory. Если родительский объект не доступен для обхода, он будет перемещаться вверх по родительскому дереву, пока не найдет перемещаемый каталог или не достигнет корня файловой системы.

Убедитесь, что все папки по указанному пути существуют и доступны для зарегистрированного пользователя (в linux бит «исполняемый» контролирует доступность каталога). Так что если вы видите что-то вроде

-d x Документы

после выполнения

ls -l *

в оболочке, тогда каталог Documents доступен.

...