[英]Head First Design Patterns - Combined Pattern
我正在阅读 Head First Design Patterns 中关于组合模式的第 12 章。 在第 541 页,示例 DJView,它无法在我的计算机中正确运行。当我按下“开始”时,程序只响一次而不是循环响起。 我不确定是否因为我的系统环境。 但是如果我在 class BeatModel的方法元中添加一行代码,它可以工作。就像:
public void meta(MetaMessage message) {
if (message.getType() == 47) {
beatEvent();
sequencer.setMicrosecondPosition(0); //add this line
sequencer.start();
setBPM(getBPM());
}
}
谁能告诉我为什么? 我很困惑,是书上给出的代码有问题还是其他原因? 帮我。 提前致谢!!
不好意思,代码太长没放在这里,你可以到官网下载,这里是链接http://www.headfirstlabs.com/books/hfdp/HeadFirstDesignPatterns_code102507.zip
您可以在此文件夹 '\HeadFirstDesignPatterns_code102507\HF_DP\src\headfirst\combined\djview' 中找到示例。
运行 class DJTestDrive.java
期待您的帮助。
编辑#2 :为了完整起见,Head First Design Patterns Elisabeth Freeman 的作者本人已经注意到,她书中的代码仅使用 Java 1.4 进行了测试。 她已承诺会考虑我们的反馈。
编辑:在播放过程中, Sequencer.setTempoInBPM
似乎存在错误。 您将微秒 position 设置为0
的方法是正确的方法——它基本上在定序器结束后立即倒带(即消息类型 = 47)。
不幸的是,示例代码似乎不正确。 有几个问题:
sequencer
器未初始化为循环播放meta()
方法重置 BPM 并重新通知所有侦听器,但不会将定序器重置为其原始 position,这是您为使其工作而进行的。 但是,只要将音序器设置为循环播放,此方法就不需要执行任何操作。off()
方法将 BPM 设置为0
,这将使音序器快进到所有循环的末尾——这意味着下次启动播放器时,它将从末尾开始,并且不会播放任何内容。这些更改应该可以解决问题:
#1在方法BeatModel.buildTrackAndStart
中,添加sequencer.setLoopCount
如下:
public void buildTrackAndStart() {
// ...
try {
sequencer.setSequence(sequence);
sequencer.setLoopCount(Integer.MAX_VALUE); // play forever
} catch(Exception e) {
// ...
}
#2从方法BeatModel.meta(MetaMessage)
中删除所有语句:
public void meta(MetaMessage message) {
}
#3从方法BeatModel.off()
中删除setBPM(0)
) :
public void off() {
// -- remove this -- setBPM(0);
sequencer.stop();
}
在 Java 8 上,只需添加
sequencer.setMicrosecondPosition(0);
到 BeatModel.meta() 使它工作得很好!
向所有人问好,hebgeenbrug
我在阅读时遇到了类似的错误。 在我的电脑中,processBar 没有更新。
1.首先我添加“sequencer.setMicrosecondPosition(0);” 在“公共无效元(MetaMessage 消息)”中;
2.其次我删除“sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);” 在“公共无效 setUpMidi()”中; 它连续声音但“元(MetaMessage消息)”不会被注意到,所以ProcessBar不会更新。
3.然后它工作
可能是我的经验可以帮助别人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.