(Java) Как сохранить много объектов одновременно в JList на Java?

Цель

Я настраиваю приложение для личного использования. Это приложение может создавать множество миди-файлов на Java.

Я хочу сохранить много объектов одновременно в JList на Java. Теперь я могу сохранить только 1 файл одновременно.

Пожалуйста, объясните мне, почему я не могу сохранить много файлов одновременно в моей идее шнура ниже.

Проблемы

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

Моя идея

(Помещение)

  • Это приложение использует JList и JFilechooser.
  • Я проверил и нашел действие сохранения файлов из всех классов.
  • Я уже изменил детали JFileChooser. Теперь я могу использовать множественный выбор.

(Резюме моей идеи)

Я использую Files[]. Я изменился, чтобы быть многократным, как это.

File xxxxx = getSelectedFile()  
File[] yyyyy = getSelectedFiles()

Исходный код

(Исходный код)

/**
 * Save Files Action
 */
public Action saveMidiFileAction = getModel().new SelectedSequenceAction(
    "Save",
    "Save selected MIDI sequence to file"
) {
    @Override
    public void actionPerformed(ActionEvent event) {
        PlaylistTableModel playlistModel = getModel();
        SequenceTrackListTableModel sequenceModel = playlistModel.getSelectedSequenceModel();
        String fn = sequenceModel.getFilename();
        if( fn != null && ! fn.isEmpty() ) setSelectedFile(new File(fn));
        if( showSaveDialog((Component)event.getSource()) != JFileChooser.APPROVE_OPTION ) return;
        File f = getSelectedFile();
        if( f.exists() ) {
            fn = f.getName();
            if( ! confirm("Overwrite " + fn + " ?\n" + fn + " is OK?") ) return;
        }
        try ( FileOutputStream out = new FileOutputStream(f) ) {
            out.write(sequenceModel.getMIDIdata());
            sequenceModel.setModified(false);
            playlistModel.fireSequenceModified(sequenceModel, false);
        }
        catch( IOException ex ) {
            ex.printStackTrace();
            showError( ex.getMessage() );
        }
    }
};

(Моя идея)

/**
 * Save Files Action
 */
public Action saveMidiFileAction = getModel().new SelectedSequenceAction(
    "Save",
    "Save selected MIDI sequence to file"
) {
    @Override
    public void actionPerformed(ActionEvent event) {
        PlaylistTableModel playlistModel = getModel();          
        SequenceTrackListTableModel sequenceModel = playlistModel.getSelectedSequenceModel();                   
        String fn = sequenceModel.getFilename();
        if( fn != null && ! fn.isEmpty() ) setSelectedFile(new File(fn));
        if( showSaveDialog((Component)event.getSource()) != JFileChooser.APPROVE_OPTION ) return;
        File[] f = getSelectedFiles();
        for (int i = 0; i < f.length; i++) {
        if( f[i].exists() ) {
            fn = f[i].getName();
            if( ! confirm("Overwrite " + fn + " ?\n" + fn + " is OK?") ) return;
}
        try ( FileOutputStream out = new FileOutputStream(f[i]) ) {
            out.write(sequenceModel.getMIDIdata());
            sequenceModel.setModified(false);
            playlistModel.fireSequenceModified(sequenceModel, false);
        }
        catch( IOException ex ) {
            ex.printStackTrace();
            showError( ex.getMessage() );
        }
        }
    }
};

```

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

  • PlaylistTableModel.java
  • SequenceTrackListTableModel.java
  • .setModified.java
  • .fireSequenceModified.java

P.S.

Я мог бы быть не так хорош с Java.


person Dan    schedule 26.04.2017    source источник
comment
Вы должны проверить длину извлеченного массива из getSelectedFiles(). Действительно ли оно больше 1? Цикл for выполняется несколько раз? Попробуйте отладить ваше приложение, чтобы вы знали, что на самом деле происходит под капотом.   -  person MC Emperor    schedule 26.04.2017
comment
Спасибо комментарий. Я пытался проверить длину, отладить и так далее... getSelectedFiles(), я думаю, это всего лишь 1 файл. Если я попытаюсь сохранить много раз, я могу несколько разных файлов. Я также пытался отладить. Но я не мог проблемы. Возможно, мне нужно изучить java, swing, Array, JList. Особенно JList сложен для меня.   -  person Dan    schedule 27.04.2017


Ответы (2)


Это особенность JFilesChooser. getSelectedFiles будет всегда пустым, если вы не установили для флага setMultiSelectionEnabled значение true. Вам нужно установить этот флаг перед тем, как открыть диалоговое окно.

Вы можете ожидать, что он вернет массив, содержащий один файл, если множественный выбор отключен, но это не так.

public class Test
{
    public static void main(String... args)
    {
        final JFileChooser chooser = new JFileChooser();
        // This is the flag you need:
        chooser.setMultiSelectionEnabled(true);
        chooser.showSaveDialog(null);

        for (File f : chooser.getSelectedFiles())
        {
            System.out.println(f.getName());
        }
    }
}

Если вам нужен только один файл, вы должны использовать getSelectedFile (единственное число).


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

person Michael    schedule 26.04.2017
comment
Спасибо комментарий. Я попытался связать, как вы сказали, как показано ниже. Я снова исследовал JFilesChooser, и я действительно понимаю, что такое множественный выбор. Я также прочитал официальную домашнюю страницу Java. - person Dan; 27.04.2017

Спасибо комментарий. Я попытался связать, как вы сказали, как показано ниже. Я снова исследовал JFilesChooser, и я действительно понимаю, что такое множественный выбор. Я также прочитал официальную домашнюю страницу Java.

/**
 * Save Files Action
 */
public Action saveMidiFileAction = getModel().new SelectedSequenceAction(
    "Save",
    "Save selected MIDI sequence to file"
) {
    @Override
    public void actionPerformed(ActionEvent event) {
        PlaylistTableModel playlistModel = getModel();          
        SequenceTrackListTableModel sequenceModel = playlistModel.getSelectedSequenceModel();                   
        String fn = sequenceModel.getFilename();
        if( fn != null && ! fn.isEmpty() ) setSelectedFile(new File(fn));
        if( showSaveDialog((Component)event.getSource()) != JFileChooser.APPROVE_OPTION ) return;

 final JFileChooser chooser = new JFileChooser();
        // This is the flag you need:
        chooser.setMultiSelectionEnabled(true);
        chooser.showSaveDialog(null);

        for (File f : chooser.getSelectedFiles())
        {
            System.out.println(f.getName());
        }
 }
    }
};

Я написал так. Когда я открываю это, меню «Файл» появляется 2 раза. Но мне не удалось сохранить файл. не было файлов. Я думал и пробовал это 1 день. но я не мог понять ... извините, я думаю, что мне нужно изучить java и иметь базовые знания ... извините и спасибо, что вы советуете.


(Мое ожидание)

Используя JList, мы не смогли получить модель (i). Если бы я мог использовать (i), я мог бы легко сохранить много файлов с помощью предложения «for».

С другой стороны, я попытался сохранить и собрать MIDI-файлы для Zip-файла. Затем мне нужно преобразовать тип файла из типа последовательности (MIDI).

Я постараюсь изучать там вещи изо дня в день... Так что спасибо за комментарии.

person Dan    schedule 27.04.2017