首页 > 解决方案 > 我无法停止音乐

问题描述

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

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

在这门课上,我尝试让按钮做一些事情,它可以工作,然后我尝试在按钮上播放音乐,在我关闭时停止它 - 它开始但不会停止

标签: javajavasound

解决方案


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

我建议采取以下措施。

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

其他一些建议:

  • 我看不出你是如何做任何需要DataLine的,我会implements DataLine从你的Banger班级中删除。
  • loop方法Clip将开始播放,因此您不需要该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();

推荐阅读