Как сохранить файл с помощью JFileChooser?

У меня есть метод в моем приложении под названием «Сохранить как», который сохраняет изображение моего приложения на компьютере в файл. Я использовал JFileChooser, чтобы пользователи могли выбрать желаемое место для сохранения файла. Проблема в том, что если пользователь явно не вводит формат файла, он сохраняет файл без расширения. Как я могу иметь такие форматы, как jpg, png в раскрывающемся меню «Тип файла».

и как я могу получить расширение из раскрывающегося меню «Тип файла» для сохранения моего файла изображения.

 ImageIO.write(image,extension,file);

person Lokesh Kumar    schedule 27.03.2010    source источник


Ответы (4)


Наконец, я решил свою проблему:

JFileChooser fc = new JFileChooser("C:/");
fc.addChoosableFileFilter(new JPGSaveFilter());
fc.addChoosableFileFilter(new JPEGSaveFilter());
fc.addChoosableFileFilter(new PNGSaveFilter());
fc.addChoosableFileFilter(new GIFSaveFilter());
fc.addChoosableFileFilter(new BMPSaveFilter());
fc.addChoosableFileFilter(new WBMPSaveFilter()); 

int retrieval = fc.showSaveDialog(null);

if (retrieval == JFileChooser.APPROVE_OPTION) {
  String ext = "";

  String extension = fc.getFileFilter().getDescription();

  if (extension.equals("*.jpg,*.JPG")) {
    ext = ".jpg";
  } else if (extension.equals("*.png,*.PNG")) {
    ext = ".png";
  } else if (extension.equals("*.gif,*.GIF")) {
    ext = ".gif";
  } else if (extension.equals("*.wbmp,*.WBMP")) {
    ext = ".wbmp";
  } else if (extension.equals("*.jpeg,*.JPEG")) {
    ext = ".jpeg";
  } else if (extension.equals("*.bmp,*.BMP")) {
    ext = ".bmp";
  }
}

Пример фильтра:

package example

import java.io.File;
import javax.swing.filechooser.FileFilter;

class JPGSaveFilter extends FileFilter {
  @Override
  public boolean accept(File f) {
    if (f.isDirectory()) {
      return false;
    }

    String s = f.getName().toLowerCase();

    return s.endsWith(".jpg");
  }

  @Override
  public String getDescription() {
    return "*.jpg,*.JPG";
  }
}
person Lokesh Kumar    schedule 28.03.2010

Подготовьте фильтры выбора файлов:

    jFileChooser.addChoosableFileFilter(new FileNameExtensionFilter("File X (.xxx)", "xxx"));
    jFileChooser.addChoosableFileFilter(new FileNameExtensionFilter("File Y (.yyy)", "yyy"));
    jFileChooser.addChoosableFileFilter(new FileNameExtensionFilter("File Z (.zzz)", "zzz"));

    // set default type
    jFileChooser.setFileFilter(jFileChooser.getChoosableFileFilters()[0]);

    // set default file
    jFileChooser().setSelectedFile(defaultFile);

После одобрения проверки

//Add extension to Selected file 
File file = new File(jFileChooser().getSelectedFile().getCanonicalPath() + "." + ((FileNameExtensionFilter) jFileChooser().getFileFilter()).getExtensions()[0]);

Может быть хорошей идеей проверить, есть ли у выбранного файла расширение.

person Daniel De León    schedule 22.05.2013
comment
Могу я просто сказать, что принципы LOD выходят за рамки этого ответа. - person e.doroskevic; 08.05.2015
comment
ОМГ ЛОД, снова! Извините, это был не я, я просто еще один парень, который столкнулся с этим. - person Daniel De León; 29.05.2015

Используйте пример JFileChoose.SetFileFilter: http://www.java2s.com/Code/JavaAPI/javax.swing/JFileChoosersetFileFilterFileFilterfilter.htm

person Pierre    schedule 27.03.2010
comment
хорошо .. setFileFilter покажет расширение в раскрывающемся меню «Тип файла». но как получить или использовать выбранное расширение из этого раскрывающегося меню типа файла. - person Lokesh Kumar; 28.03.2010
comment
Когда у вас есть выбранный файл, это должно быть так же просто, как String ext = file.getName().substring(file.getName().lastIndexOf(.)); - person Greg Case; 28.03.2010
comment
Это довольно сумасшедший URL-адрес... он содержит java, файл и фильтр по три раза каждый. - person ArtOfWarfare; 29.11.2012

Я думаю, что нашел лучшее решение. Поясню это с примерами фрагментов кода.

Вот как я устанавливаю файловый фильтр:
jFileChooser.setFileFilter(new FileNameExtensionFilter(".txt", "txt"));.

После этого основная строка сохранения:
textArea1.write(new BufferedWriter(new FileWriter(jFileChooser.getSelectedFile().getAbsolutePath() + jFileChooser.getFileFilter().getDescription().replace("All Files", ""))));.

Конечно, самым важным является этот фрагмент: jFileChooser.getSelectedFile().getAbsolutePath() + jFileChooser.getFileFilter().getDescription().replace("All Files", "").

Единственное, что мне не нравится, так это то, что я не смог найти ни одного метода типа 'getExtension', а это значит, что у Вас не может быть красивого описания без лишних заморочек со строками.


Хорошо понял. Вы можете сделать что-то вроде этого: jFileChooser.getFileFilter().toString().replaceFirst(".*extensions=\\[(.*)]]", ".$1").replaceFirst(".*AcceptAllFileFilter.*", "").

К сожалению, это не так красиво, но, кажется, работает как шарм.

person kcpr    schedule 30.08.2014