Java 我无法停止音乐

Java 我无法停止音乐,java,javasound,Java,Javasound,我有以下代码的问题;我创建了两个类: import javax.sound.sampled.DataLine; import javax.swing.JOptionPane; public class Banger implements DataLine { void playMusic(String musicLocation) { try { File musicPath = new File(musicLo

我有以下代码的问题;我创建了两个类:

import javax.sound.sampled.DataLine;
import javax.swing.JOptionPane;

public class Banger implements DataLine {
    void playMusic(String musicLocation) {
                
        try {
            File musicPath = new File(musicLocation);
            
            if  (musicPath.exists()) {
            AudioInputStream audioInput = AudioSystem.getAudioInputStream(musicPath);
            Clip clip = AudioSystem.getClip();
            clip.stop();
            clip.open(audioInput);
            clip.start();
            clip.loop(clip.LOOP_CONTINUOUSLY);
            }
            else {
                System.out.println("ERROR");
            }
            }
            catch(Exception ex) {
                ex.printStackTrace();
            }
    }
}
在这节课上,我试图制作一个音乐播放器,它工作得非常完美

    public void mouseEntered(MouseEvent e) {
        message6.setVisible(true);
        options.setBackground(Color.YELLOW);
        String filepath = "p.wav";
        Banger musicObject = new Banger();
        musicObject.playMusic(filepath);
        }
    public void mouseExited(MouseEvent e) {
        message6.setVisible(false);
        options.setBackground(new Color(0, 0, 0, 0));
        Banger musicObject = new Banger();
        String filepath = "p.wav";
        clip.stop();
    }

在这个类中,我尝试让一个按钮做一些事情,它工作,然后我尝试在我按下按钮时播放音乐,在我关闭按钮时停止它-它启动但不会停止

您正在关闭的对象
mouseExited
是一个新的、单独的
Banger
实例,而不是您实例化的实例

我建议采取以下措施

(1) 在播放并停止Banger的类中为其创建一个实例变量。 (2) 在Banger中,将构造函数与启动和停止
剪辑的各个方法分开

其他一些建议:

  • 我看不出您是如何做任何需要
    DataLine
    的事情的,我会从您的
    Banger
    类中删除
    implements DataLine
  • Clip
    loop
    方法将开始播放,因此您不需要使用
    start
    方法
快速重写Banger:

public class Banger {

    private Clip clip;

    public Banger(String musicLocation) {
            
        try {
            File musicPath = new File(musicLocation);
            if  (musicPath.exists()) {
                AudioInputStream audioInput = AudioSystem.getAudioInputStream(musicPath);
                clip = AudioSystem.getClip();
                clip.open(audioInput);
            else {
                System.out.println("ERROR");
            }
        }
        catch(Exception ex) {
            ex.printStackTrace();
        }
    }
    
    public void play() {
        clip.setFramePosition(0);
        clip.loop(clip.LOOP_CONTINUOUSLY);
    }

    public void stop() {
        clip.stop();
    }
}
现在,
mouseEntered
mouseExited
应该访问相同的实例变量

private Banger banger; 
public void setBanger(String filepath) {
    banger = new Banger(filepath);
}

public void mouseEntered(MouseEvent e) {
    // some code omitted
    banger.play();
}
// similar for mouseExited, calling banger.stop();