(Java)如何在Java中的JList中同时保存多个对象?
(Java) How to save many objects at the same time in JList in Java?
目的
我正在定制一个应用程序供个人使用。这个应用程序可以制作许多 Java.
的 midi 文件
我想在Java中的JList中同时保存很多对象。
现在我可以同时保存唯一的1个文件了。
请在下面的cord idea中告诉我为什么不能同时保存多个文件。
问题
没有错误信息。
但是当我更改代码时,我无法保存文件。
我在任何地方都找不到文件。
我的想法
(前提)
- 此应用程序正在使用 JList 和 JFilechooser。
- 我检查并找到了所有 类 的保存文件操作。
- 我已经更改了 JFileChooser 的细节。现在我可以使用 multiplicate select.
(我的想法总结)
我用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() );
}
}
}
};
```
如果我需要添加有关以下项目的详细信息,我会写出来。
不过我觉得这些现在都不那么重要了
PlaylistTableModel.java
SequenceTrackListTableModel.java
.setModified.java
.fireSequenceModified.java
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)转换为文件类型。
我会努力每天研究那里的东西...
所以感谢评论。
目的
我正在定制一个应用程序供个人使用。这个应用程序可以制作许多 Java.
的 midi 文件我想在Java中的JList中同时保存很多对象。 现在我可以同时保存唯一的1个文件了。
请在下面的cord idea中告诉我为什么不能同时保存多个文件。
问题
没有错误信息。 但是当我更改代码时,我无法保存文件。 我在任何地方都找不到文件。
我的想法
(前提)
- 此应用程序正在使用 JList 和 JFilechooser。
- 我检查并找到了所有 类 的保存文件操作。
- 我已经更改了 JFileChooser 的细节。现在我可以使用 multiplicate select.
(我的想法总结)
我用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() );
}
}
}
};
```
如果我需要添加有关以下项目的详细信息,我会写出来。 不过我觉得这些现在都不那么重要了
PlaylistTableModel.java
SequenceTrackListTableModel.java
.setModified.java
.fireSequenceModified.java
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)转换为文件类型。
我会努力每天研究那里的东西... 所以感谢评论。