Java JFilechooser

Я хотел бы иметь возможность контролировать внешний вид файла JFileChooser. В частности, я хотел бы сохранить то, как отображалось JFileChooser, когда оно показывалось в последний раз. Я хотел бы сохранить, использовался ли он в представлении сведений/списка и по какому столбцу (например, размер или дата изменения) списки были отсортированы.

Я знаю, что есть много вопросов о JFileChooser, но я не смог найти то, что ищу.

Спасибо

EDIT: это было предложено в качестве ответа, но сохранения ссылки на средство выбора файлов недостаточно, так как я хочу сохранить настройки много раз, когда я запускаю приложение.

EDIT: например, я обычно хочу открыть самый последний загруженный файл, поэтому я хочу отсортировать по дате изменения и отобразить в подробном представлении


person Leon    schedule 28.07.2011    source источник
comment
самый последний файл, который я загрузил,.. Как пользователь, я бы предпочел, чтобы мне предлагали JMenu, содержащий список Recent Files (или подобных). File объекты также могут быть сериализованы.   -  person Andrew Thompson    schedule 28.07.2011
comment
@ Андрей, я ценю твое предложение. Обычно я загружаю файл или сохраняю вложение электронной почты, и мне нужно импортировать его в свое приложение, поэтому он не может быть в списке последних.   -  person Leon    schedule 28.07.2011
comment
..поэтому он не может быть в списке последних. Я не понимаю этот комментарий. File можно добавить в список последних файлов при первом импорте/открытии.   -  person Andrew Thompson    schedule 28.07.2011
comment
Я обычно сохраняю вложения в ту же папку. У меня уже есть эта папка, открывающаяся по умолчанию, когда я импортирую в свое приложение, но я хотел бы, чтобы fileChooser отображал эту папку в подробном представлении и отсортировал по дате изменения   -  person Leon    schedule 28.07.2011
comment
Я до сих пор не совсем понимаю, как что-то из того, что вы сказали, проще, чем список «последних файлов», но если вы должны пойти по этому пути, я предлагаю полностью отказаться от JFileChooser и разработать собственный инструмент выбора файлов. что позволяет детали, которые вы хотите сохранить. Вы можете начать этот процесс с кода, показанного в графическом интерфейсе файлового браузера.   -  person Andrew Thompson    schedule 28.07.2011
comment
Хороший файловый браузер, +1 в этой теме. Файлы, которые я хочу импортировать, приходят по электронной почте. Сохраняю все в одну папку. Со временем накапливаются в этой папке. Когда приходит новое электронное письмо, я сохраняю вложение и хочу импортировать этот файл из этой конкретной папки. Поэтому я не хочу искать весь каталог по имени нового файла, я просто хочу, чтобы они были отсортированы по дате изменения, что означает, что новый файл будет легко найти (вверху или внизу списка). Как только я выбираю файл для импорта, он обрабатывается и сохраняется в базе данных. Из БД я недавно открыл инструменты, реализованные   -  person Leon    schedule 28.07.2011
comment
это всего лишь 1 приложение, но сохранение состояния средства выбора файлов может иметь и другое применение, например, ваш файловый менеджер в вашей ОС сохраняет, какой вид у вас был в папке и как элементы были сохранены   -  person Leon    schedule 28.07.2011
comment
@AndrewThompson позвольте нам продолжить обсуждение в чате   -  person Leon    schedule 28.07.2011


Ответы (3)


Как насчет сериализации объектов? Вы можете сохранить объект JFileChooser в файл, а затем извлечь его.

person Sai Kumar    schedule 28.07.2011
comment
+1 Это был намного более быстрый способ сказать то, что я сказал. ..И раньше! - person Andrew Thompson; 28.07.2011
comment
Я реализовал сериализацию и попробовал версию Эндрю. Этот подход сохраняет выбранную папку и выбранный файл, но не порядок сортировки и подробный вид. - person Leon; 28.07.2011

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


Сохранение между прогонами.

Существует несколько способов хранения данных между запусками (например, файл свойств, XML, Preferences и т. д.). Это быстрый и грязный способ добиться этого.

import java.awt.event.*;
import javax.swing.*;
import java.io.*;

class SerializeMyChooser {

    static private JFileChooser fileChooser;
    static File serializedChooser = new File("chooser.ser");

    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                final JButton showChooser = new JButton("Open File");
                showChooser.addActionListener( new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                        if (fileChooser==null) {
                            if (serializedChooser.exists()) {
                                // use the resialized form
                                try {
                                    ObjectInputStream ois = new ObjectInputStream(
                                        new FileInputStream(serializedChooser));
                                    fileChooser = (JFileChooser)ois.readObject();
                                    ois.close();
                                } catch(Exception e) {
                                    // something SNAFU - use fall-back
                                    fileChooser = new JFileChooser();
                                    // configure file chooser..
                                }
                            } else {
                                fileChooser = new JFileChooser();
                                // configure file chooser..
                            }
                        }
                        fileChooser.showOpenDialog(showChooser);
                    }
                });

                JOptionPane.showMessageDialog(null, showChooser);

                if (fileChooser!=null) {
                    try {
                        ObjectOutputStream oos = new ObjectOutputStream(
                            new FileOutputStream(serializedChooser));
                        oos.writeObject(fileChooser);
                        oos.flush();
                        oos.close();
                    } catch(Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }
}

Правильный ввод-вывод и обработка исключений остаются в качестве упражнения для пользователя.

person Andrew Thompson    schedule 28.07.2011
comment
спасибо за ответ, этого недостаточно, так как я хочу, чтобы настройки сохранялись между запусками приложения. Я отредактирую вопрос - person Leon; 28.07.2011
comment
Спасибо, Эндрю. Я следовал совету MSK и реализовывал это сам. Огромные усилия. Используя вашу версию и используя мою, мы получаем одинаковые результаты. Папка запоминается, как и выбранный файл, однако сортировка по дате изменения и подробный вид не сохраняются. Я действительно хочу сохранить порядок сортировки и подробный вид - person Leon; 28.07.2011
comment
Виноват. Я тестировал его только для сохранения текущего каталога. :( - person Andrew Thompson; 28.07.2011
comment
Это нормально. Я ценю ваши усилия. Я могу извлечь папку и файл без сериализации. Сериализация также сохраняет положение ползунка, но не те функции, которые мне нужны. - person Leon; 28.07.2011
comment
@ Эндрю Томпсон, я знаю, что это пример, но все потоковые объекты должны быть закрыты в блоке finally, +1 - person mKorbel; 28.07.2011
comment
@mKorbel Вы заметили мое последнее предложение «не моя проблема»? ;) - person Andrew Thompson; 28.07.2011

К сожалению, то, что вы хотите сделать, не является тривиальным. Так должно быть, но это не реализовано таким образом. Отображение каталога и сортировка являются частью LAF. Единственный способ получить желаемое поведение — реализовать собственный BasicFileChooserUI, переопределяющий create/getModel и обеспечивающий реализацию BasicDirectoryModel. Метод сортировки BasicDirectoryModel — это место, где фактически выполняется сортировка.

Я слышал похвалу XFileDialog, но сам не пробовал. Это то, что нужно исследовать, имея в виду, что это только для Windows (возвращается к JFileChooser в OSX или Linux).

person Devon_C_Miller    schedule 29.07.2011
comment
+1. я полностью согласен. это должно быть тривиально. я буду вам предложения, когда я вернусь домой. - person Leon; 29.07.2011
comment
Я пытался это сделать, но не смог реализовать. Я создал новый вопрос stackoverflow.com/questions/6874181/, чтобы сохранить ясность - person Leon; 29.07.2011