Как мне приостановить и возобновить звук другим методом, отличным от метода, в котором он был создан?

#java #audio

#java #Аудио

Вопрос:

Я пытаюсь создать игру и пытаюсь сделать кнопки «отключить звук» и «включить звук», но я не могу понять, как сделать так, чтобы при нажатии кнопки останавливался тот же клип, который воспроизводится в начале программы. (используя другие методы, конечно). Я попытался сделать клип и аудио общедоступными, но я продолжаю получать сообщение об ошибке, и я не уверен, почему.

 public class TowerDefense 
{
    String filepath = "MenuTheme.wav";
    private Clip clip;
void playMusic(String musicLocation) 
{
    try{
        File musicPath = new File(musicLocation);

        if(musicPath.exists())
        {
        AudioInputStream audioInput = AudioSystem.getAudioInputStream(musicPath);
        clip = AudioSystem.getClip();
        clip.open(audioInput);
        clip.start();
        clip.loop(Clip.`LOOP_CONTINUOUSLY`);
        }
    }
    catch(Exception ex)
    {
        ex.printStackTrace();
    }
}
void pauseMusic(String musicLocation2)
{
long clipTimePosition = clip.getMicrosecondPosition();
clip.stop();    
}
==============
//this is in a different private method called Options
panel.setButtonsActionListener2(**new** ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e){
    frame.dispose();
        TowerDefense musicObject = new TowerDefense();
        musicObject.pauseMusic(filepath);
    Options();
        }
    });
  

Я ожидал, что на выходе клип остановится, а затем вы можете либо заставить его воспроизводиться снова, либо оставить его отключенным. В этом случае он просто сообщает об ошибке, когда я нажимаю кнопку «отключить звук».

Комментарии:

1. хорошо, одну секунду, это новая java?? я пропустил большую революцию?? /**long**/

2. извините, я избавился от них сейчас

Ответ №1:

Итак, в коде, который запускается при нажатии кнопки отключения звука, вы создаете новый объект TowerDefense, которому предоставляется путь к файлу музыки. Вот в чем проблема с этим. Клип, который уже воспроизводится, существует в программе. Создание нового объекта TowerDefense автоматически не предоставит вам доступ к воспроизводимому клипу.

Убедитесь, что вы вызываете метод pauseMusic для того же объекта, где вы вызывали метод PlayMusic.

Таким образом, если вы уже создали объект TowerDefense в программе и вызвали PlayMusic, то предоставьте вашему action listener доступ к этому объекту и используйте существующий объект для вызова pauseMusic.