(Java)如何在Java中的JList中同时保存多个对象?

(Java) How to save many objects at the same time in JList in Java?

目的

我正在定制一个应用程序供个人使用。这个应用程序可以制作许多 Java.

的 midi 文件

我想在Java中的JList中同时保存很多对象。 现在我可以同时保存唯一的1个文件了。

请在下面的cord idea中告诉我为什么不能同时保存多个文件。

问题

没有错误信息。 但是当我更改代码时,我无法保存文件。 我在任何地方都找不到文件。

我的想法

(前提)

(我的想法总结)

我用Files[]。我改成了这样的multi-plicate

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() );
        }
        }
    }
};

```

如果我需要添加有关以下项目的详细信息,我会写出来。 不过我觉得这些现在都不那么重要了

P.S.

我可能对 Java 不太满意。

这是 JFilesChooser 的怪癖。如果您没有将 setMultiSelectionEnabled 标志设置为 true,getSelectedFiles 始终 为空。您需要在打开对话框之前设置该标志。

如果 multiselection 被禁用,您可能希望它 return 包含单个文件的数组,但事实并非如此。

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(单数)。


有趣的是,当启用 multi-select 时,getSelectedFile 仍然可以工作并且 return 是 selected 的第一个文件。看来这个 class 对我来说实施得很糟糕。

感谢评论。我试过像你说的那样编线,如下所示。又研究了一下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)转换为文件类型。

我会努力每天研究那里的东西... 所以感谢评论。