问题描述
我正在从事一个学校编码项目,该项目涉及使用Java中的jfugue库。但是,将加载和编辑的模式保存到文件时,我遇到了很大的困难。到目前为止,我已经尝试了player.saveMidi(无法识别)和MidiFileManager.savePatternToMidi函数,但是所做的修改没有保存。
以下是上述代码的片段:
Pattern pattern = new Pattern(MidiFileManager.loadPatternFromMidi(new File(filePath.getText())));
TextField midiData = new TextField(pattern.toString());
midiData.setFont(Font.font(14));
pattern = new Pattern(midiData.getText());
Button save = new Button("Save Edits");
Pattern finalPattern = pattern;
save.setonAction(e -> {
try {
MidiFileManager.savePatternToMidi(finalPattern,new File(filePath.getText()));
Load.playAndEdit(filePath);
} catch (Exception ex) {
ex.printstacktrace();
}
});
任何帮助都将不胜感激!
解决方法
尽管您怀疑这是JFugue的问题,但潜在的问题在于代码的JavaFX部分。
主要问题是代码的编写方式,似乎期望显示TextField,用户将进行更改,并且代码将记住“ pattern = new Pattern(midiData .getText())”。 JavaFX TextField不是这样工作的。 UI元素不是像这样的顺序。而是使用动作(或在JavaFX中,您可以将UI组件的值与数据元素“绑定”)。如果您在用户按下“保存”按钮时触发的操作中从“文本字段”中获取文本,则将获得来自文本字段的最新数据。在编写代码时,用户的更改永远不会放入变量中。
另外两个注意事项:
-
在第一行中,MidiFileManager.loadPatternFromMidi返回一个模式,因此您无需将其放入“ new Pattern()”。
-
无需说“模式finalPattern =模式”。这只是创建一个新变量,该变量指向与现有变量相同的数据。您可以只保存“模式”,如果它具有您希望从文本字段中获得的信息(但是,再次说,这不是正确的位置,因此它不会具有您期望的信息)。 / p>
测试这不是JFugue问题的一种方法是创建一个简单的程序,例如:
Pattern pattern = MidiFileManager.loadPatternFromMidi(new File(filePath.getText()));
pattern.add(" C D E");
MidiFileManager.savePatternToMidi(pattern,new File(filePath.getText()));
然后您将看到生成的模式在末尾添加了三个新注释。