Как остановить непрерывную звуковую петлю из другого класса? - PullRequest
1 голос
/ 08 октября 2019

У меня проблема со звуковым циклом в моем коде. Сам звук в другом классе, и я хотел бы остановить его, нажав кнопку j в другом классе.

Код в классе звука:

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

Я много пробовалвещей, чтобы остановить звук, нажав кнопку j в другом классе (ActionListener), но, похоже, ничего не работает. Любые идеи?

Редактировать: я забыл сказать, что я также пытался сделать звуковой метод в том же классе с jbutton, но это тоже не сработало. (следующий код)

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

Редактировать 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() там явно не работает.

1 Ответ

0 голосов
/ 10 октября 2019

Прежде всего, Clip должна быть переменной экземпляра. Не объявляйте это в вашем методе. Объявите это на уровне класса. Затем у вас может быть открытый, выделенный метод класса, который ссылается на клип и останавливает его.

И когда вы сделаете это (сделаете его переменной экземпляра), было бы также улучшением сделать воспроизведениеКлип будет своим индивидуальным методом. Когда вы инициализируете клип, а затем запускаете его одним способом, весь файл должен быть считан в память, прежде чем клип начнет воспроизводиться. Это может привести к серьезному запаздыванию, если клип представляет собой большой файл.

Рекомендуется сначала загрузить клипы, а затем удерживать их в памяти, пока не наступит время их воспроизведения. Если вы не хотите хранить эти данные в памяти, вам лучше использовать SourceDataLine.

...