Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 头先设计模式-组合模式_Java_Design Patterns - Fatal编程技术网

Java 头先设计模式-组合模式

Java 头先设计模式-组合模式,java,design-patterns,Java,Design Patterns,我正在阅读第12章关于头先设计模式中的组合模式。 在第541页的示例DJView中,它无法在我的计算机中正确运行。当我按下“开始”按钮时,程序只发出一次声音,而不是循环。 我不确定是否是因为我的系统环境。 但是如果我在类BeatModel的方法meta中添加一行代码,它就会工作。例如: public void meta(MetaMessage message) { if (message.getType() == 47) { beatEvent();

我正在阅读第12章关于头先设计模式中的组合模式。 在第541页的示例DJView中,它无法在我的计算机中正确运行。当我按下“开始”按钮时,程序只发出一次声音,而不是循环。 我不确定是否是因为我的系统环境。 但是如果我在类BeatModel的方法meta中添加一行代码,它就会工作。例如:

  public void meta(MetaMessage message) {
        if (message.getType() == 47) {
            beatEvent();
            sequencer.setMicrosecondPosition(0);  //add this line
            sequencer.start();
            setBPM(getBPM());
        }
    }
谁能告诉我为什么?我很困惑,是书中给出的代码有问题还是其他原因?帮助我。 提前谢谢
很抱歉,代码太长,所以我无法将所有内容都放在这里,您可以从官方网站下载,这是链接
您可以在此文件夹“\HeadFirstDesignPatterns\u code 102507\HF\u DP\src\headfirst\combined\djview”中找到该示例。
运行类DJTestDrive.java
期待您的帮助。

编辑#2:为了完整起见,《头优先设计模式》的作者Elisabeth Freeman自己也注意到了一个事实,即她的书中的代码只经过Java 1.4测试。她已答应考虑我们的反馈意见


编辑:在播放过程中,
Sequencer.settmpoinbpm
似乎存在错误。您将微秒位置设置为
0
的方法是正确的——它基本上会在音序器结束时立即倒回音序器(即消息类型=47)


不幸的是,示例代码似乎不正确。有几个问题:

  • 音序器未初始化为在循环中播放
  • meta()
    方法重置BPM并重新调整所有侦听器,但不会将sequencer重置为其原始位置,这是为了使其工作。但是,只要sequencer设置为在循环中播放,该方法就不需要执行任何操作
  • off()
    方法将BPM设置为
    0
    ,这将使音序器快进到所有循环的末尾——这意味着下次启动播放机时,它将从末尾开始,不会播放任何内容
  • 这些变化应该起到作用:

    #1在方法
    BeatModel.buildTrack和Start
    中,添加
    sequencer.setLoopCount
    ,如下所示:

     public void buildTrackAndStart() {
        // ...
        try {
            sequencer.setSequence(sequence);
            sequencer.setLoopCount(Integer.MAX_VALUE); // play forever
        } catch(Exception e) {
        // ...
    } 
    
    #2从方法
    BeatModel.meta(MetaMessage)
    中删除所有语句:

    #3从方法
    BeatModel.off()中删除
    setBPM(0)


    在Java8上,只需添加

    定序器。设置微秒位置(0)

    对于BeatModel.meta()使其工作正常

    大家好,,
    hebgeenbrug

    我在阅读时也遇到类似的错误。在我的计算机中,进程栏不更新

    1.首先,我在“public void meta(MetaMessage)”中添加了“sequencer.setMicrosecondPosition(0)”

    2.第二步,我删除了“public void setUpMidi()”中的“sequencer.setLoopCount(sequencer.LOOP_连续);”;它会持续发出声音,但不会注意到“meta(MetaMessage message)”,因此ProcessBar不会更新

    3.那就行了


    也许我的经验可以帮助其他人。

    你可能想给我们一些更多的东西,让我们一起工作。不是每个人都会有这本书,没有的人可能不会回复。我们是否可以使用更多的代码来正确查看您的问题。这可能是一个错误,尽管我在感谢您的回答上找不到,但您的更改似乎有一个问题:在setBPM方法中,有时sequencer.setTempoInBPM(getBPM())不起作用,我找到sequencer.getTempoInBPM()可能返回120,而不是我设置的值,你可以试一试。好吧——sequencer有一些明显的bug阻止它在播放过程中更改BPM——它有时默认为
    120
    。你的方法更好——它基本上会在序列结束时倒回序列。嗨,大家好,所以我不清楚从注释中看错误是在序列器本身还是在使用它的代码中?(可能是因为Java较新版本的sequencer发生了变化???)如果这是本书中的代码错误,请将其添加到官方勘误表中,让我们知道,谢谢!!Elisabeth(头优先设计模式的作者)@Elisabeth——不管怎样,都必须添加setMicrosecondPosition(0)更改。我们还无法解释为什么在循环播放过程中无法更改BPM——这似乎没有文档记录——因此按照书中的方式进行操作似乎更安全(在新BPM停止后使用新BPM再次播放曲目)。这是用Java1.6B26测试的。顺便说一句,我很喜欢这本书(三年前我自己买了一本)。@Elisabeth——在官方的勘误表中,有人已经提出了这个问题,但它是一个未经确认的勘误表。你测试过的Java版本能正确运行吗?我用Java1.6B18进行了测试。
    public void meta(MetaMessage message) {
    }
    
    public void off() {
        // -- remove this -- setBPM(0);
        sequencer.stop();
    }