我正在定制一个供个人使用的应用程序。这个应用程序可以用Java制作许多midi文件。
我想在Java中的JList中同时保存许多对象。 现在我可以同时保存唯一的1个文件。
请告诉我为什么我不能同时保存很多文件。
没有错误消息。 但是当我更改代码时,我无法保存文件。 我无法在任何地方找到文件。
(前提)
(我的想法摘要)
我使用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
Java
我可能不太好。
答案 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)转换为文件类型。
我会尝试每天研究那些事情...... 谢谢你的评论。