0

我正在从事一个学校编码项目,其中涉及在 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();
    }
});

任何帮助都将不胜感激!

4

1 回答 1

2

尽管您怀疑这是 JFugue 的问题,但根本问题在于代码的 JavaFX 片段。

主要问题是代码的编写方式,看起来期望是显示TextField,用户会进行更改,代码会记住“pattern = new Pattern(midiData.getText( ))”。这不是 JavaFX TextField 的工作方式。UI 元素不是这样连续的;相反,它们与动作一起工作(或者在 JavaFX 中,您可以将 UI 组件的值与数据元素“绑定”)。如果您在用户按下“保存”按钮时触发的操作中从 TextField 获取文本,您将获得来自文本字段的最新数据。在编写代码时,用户的更改永远不会放入变量中。

另外两个注意事项:

  1. 在您的第一行中,MidiFileManager.loadPatternFromMidi 返回一个 Pattern,因此您不需要将其放入“new Pattern()”中。

  2. 无需说“Pattern finalPattern = pattern”。这只是创建了一个新变量,该变量指向与现有变量相同的数据。您可以只保存“模式”,如果它具有您期望从文本字段中获得的信息(但同样,这不是说它的正确位置,因此它不会包含您期望的信息)。

测试这不是 JFugue 问题的一种方法是创建一个简单的程序,例如:

Pattern pattern = MidiFileManager.loadPatternFromMidi(new File(filePath.getText())); 
pattern.add(" C D E");
MidiFileManager.savePatternToMidi(pattern, new File(filePath.getText())); 

然后您会看到生成的模式在末尾添加了三个新音符。

于 2020-09-02T17:54:48.927 回答