我无法停止音乐

i have trouble stopping the music

我在使用以下代码时遇到问题;我创建了 2 classes:

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();
            }
    }
}

在这个 class 中,我正在尝试创建一个音乐播放器,并且效果很好。

    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();
    }

在这个 class 中,我尝试让一个按钮做一些事情,它起作用了,然后我尝试在我按下按钮时播放音乐,并在我关闭时停止它 - 它开始但不会停止

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

我推荐以下措施。

(1) 在播放和停止播放的class中为Banger创建一个实例变量。 (2) 在 Banger 中,将构造函数与启动和停止 Clip.

的各个方法分开

其他一些建议:

  • 我看不出你是如何做任何需要 DataLine 的事情的,我会从你的 Banger class.[=39= 中删除 implements DataLine ]
  • Cliploop方法会开始播放,所以不需要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();
    }
}

现在,mouseEnteredmouseExited 应该访问同一个实例变量。

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();