写信给源代质的时候无能为力



我对java中的音频有些新。我要做的是在播放音频时,我想重新粉刷我的JComponent,但是SourceDataLine阻止了包括其他线程(其他线程)的所有其他代码行。这是我的play()方法

public void play()
{
    final AudioFormat af =new AudioFormat(Note.SAMPLE_RATE, 8, 1, true, true);
    SourceDataLine line;
    try {
        line = AudioSystem.getSourceDataLine(af);
        line.open(af, Note.SAMPLE_RATE);
        line.start();
        byte[] arr=data;
        for(int position=0;position<arr.length;position++)
        {
            byte[] out={arr[position]};
            line.write(out, 0, 1);        //Blocks all user input (Mouse and Keyboard)
            this.repaint();               //Need to repaint JComponent here
        }
        line.drain();
        line.close();
    } catch (LineUnavailableException e) {
        e.printStackTrace();
    }
}

显然您在事件派遣线程上调用play。例如,也许您是从按按钮生成的动作事件来调用它的。您需要为播放循环启动一个新线程,否则GUI上什么都不会发生,直到播放结束为止。

至少,类似:

new Thread(new Runnable() {
    @Override
    public void run() {
        play();
    }
}).start();

但是,您应该阅读一些并发教程(如此),因为您似乎将访问不同线程的字段(例如byte[] arr = data;是什么)。

您也可能希望使用与Swing具有一定一定程度的摇摆工作者。我在线上有一个较长的代码示例,该示例显示了使用Swingworker:waveformdemo的播放循环的示例。播放循环围绕310行。

最新更新