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

时间:2017-04-26 05:04:16

标签: java swing jlist jfilechooser

目的

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

我想在Java中的JList中同时保存许多对象。 现在我可以同时保存唯一的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我可能不太好。

2 个答案:

答案 0 :(得分:0)

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

如果禁用了多选,您可能希望它返回包含单个文件的数组,但事实并非如此。

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仍然有效并返回所选的第一个文件。看来这堂课对我来说很糟糕。

答案 1 :(得分:0)

感谢您的评论。我按照你的说法尝试了一下。我再次研究了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次。但我没能保存档案。没有文件。 我在思考并尝试了一天。但我无法理解......抱歉 我想我需要学习java并掌握基础知识......对不起,谢谢你的建议。

(我的期望)

使用JList,我们无法获得模型(i) 如果我可以使用(i),我可以通过&#34;来保存许多文件。容易判刑。

另一方面,我尝试保存并收集Zip文件的MIDI文件。 然后我需要从序列类型(MIDI)转换为文件类型。

我会尝试每天研究那些事情...... 谢谢你的评论。