Java 如何停止来自另一个类的连续声音循环?

Java 如何停止来自另一个类的连续声音循环?,java,javasound,Java,Javasound,我的代码中有一个声音循环问题。声音本身在另一个类中,我想通过单击另一个类中的jbutton来停止它 声音类代码: public Sound() { try { URL sound = this.getClass().getClassLoader().getResource("sound.wav"); AudioInputStream audioIn = AudioSystem.getAudioInputStream(sound); Clip

我的代码中有一个声音循环问题。声音本身在另一个类中,我想通过单击另一个类中的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在同一个类中创建一个合理的方法,但也没有成功。(以下代码)

编辑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()
显然在那里不起作用。

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

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


建议的做法是首先加载剪辑,然后将其保存在内存中,直到播放它们。如果不想将此数据保存在内存中,最好使用
SourceDataLine

您到底尝试了什么?使用
clip.stop()有什么问题
在第二个示例中(在一个单独的处理程序中)?@MarsAtomic尝试了这个方法,但由于某种原因无效。我不是最伟大的java开发人员,所以我可能做错了什么。你能添加ActionListener代码块吗?@Villat!
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();
    }
});