首页 > 解决方案 > 如何停止另一个班级的连续声音循环?

问题描述

我的代码有声音循环问题。声音本身在另一个类中,我想通过单击另一个类中的 jbutton 来停止它。

声音类中的代码:

public Sound() {
    try {
        URL sound = this.getClass().getClassLoader().getResource("sound.wav");
        AudioInputStream audioIn = AudioSystem.getAudioInputStream(sound);
        Clip clip = AudioSystem.getClip();
        clip.open(audioIn);
        clip.start();
        clip.loop(Clip.LOOP_CONTINUOUSLY);
    } 
    catch (Exception e) {
        e.printStackTrace();
    }
}

我已经尝试了很多方法来通过单击另一个类(ActionListener)中的 jbutton 来停止声音,但似乎没有任何效果。有任何想法吗?

编辑:我忘了说我也尝试使用 jbutton 将声音方法放入同一个类中,但也没有让它起作用。(以下代码)

public void sound() {
    try {
        URL sound = this.getClass().getClassLoader().getResource("sound.wav");
        AudioInputStream audioIn = AudioSystem.getAudioInputStream(sound);
        Clip clip = AudioSystem.getClip();
        clip.open(audioIn);
        clip.start();
        clip.loop(Clip.LOOP_CONTINUOUSLY);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

编辑2:

JButton playB = new JButton("Play");
playB.setBounds(192, 350, 500, 100);
playB.setFont(new Font("Arial", Font.PLAIN, 80));
playB.setForeground(Color.GREEN);
menu.add(playB);
playB.setOpaque(false);
playB.setContentAreaFilled(false);
playB.setBorderPainted(false);
playB.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        clip.stop();
    }
});

clip.stop()显然不在那里工作。

标签: javajavasound

解决方案


首先,Clip应该是一个实例变量。不要在你的方法中声明它。在班级级别声明它。然后,您可以有一个公共的、专用的类方法来引用 Clip 并停止它。

当你这样做(使其成为一个实例变量)时,将播放剪辑成为它自己的单独方法也将是一个改进。当您初始化剪辑然后以单个方法启动它时,必须在剪辑开始播放之前将整个文件读入内存。如果剪辑是一个大文件,这可能会导致严重的延迟。

推荐的做法是首先加载剪辑,然后将它们保存在内存中,直到播放它们。如果您不想将这些数据保存在内存中,最好使用SourceDataLine.


推荐阅读