AudioInputStream () non si ferma
Domanda
Ho inserito un audio di sfondo nel mio programma usando AudioInputStream
.
Quando premo On
, l'audio di sfondo riprodurrà e Off
smetterà di riprodurre l'audio di sfondo.
Ecco la parte del mio codice per la parte di gioco audio:
public void playSound(int i)
{
try
{
. //Others buttons sound
. //Others buttons sound
if(i == 3 || i == 4)
{
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("Background.wav"));
Clip clip3 = AudioSystem.getClip( );
clip3.open(audioInputStream);
if(i == 3)
{
clip3.loop(Clip.LOOP_CONTINUOUSLY);
clip3.start();
settingSubMenuItem3.setEnabled(false);
settingSubMenuItem4.setEnabled(true);
}
if(i == 4)
{
clip3.stop();
settingSubMenuItem3.setEnabled(true);
settingSubMenuItem4.setEnabled(false);
}
}
catch(Exception e)
{
System.out.println("Error with playing sound.");
e.printStackTrace();
}
}
.
Ed Ecco la parte ButtonListener
:
private class MenuItemListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == settingSubMenuItem3)
{
playSound(3);
}
if(e.getSource() == settingSubMenuItem4)
{
playSound(4);
}
}
}
.
Il mio codice può riprodurre l'audio quando premo il pulsante On
, ma quando premo il pulsante Off
, non funziona.
Non ci sono errori durante la compilazione e l'esecuzione.
Qual è l'errore del mio codice?
Soluzione
La tua variabile AudioInputStream, AudioInputStream e Clip Variable, Clip3, sono locali sul metodo.L'oggetto che stai cercando di fermare non è lo stesso di quello che sta giocando al momento.
Rendili campi di classe, verificare che non siano nulli prima di chiamare i metodi su di essi, non creare un nuovo oggetto se stai cercando di interrompere l'oggetto attualmente riprodotto e dovresti essere OK.
Qualcosa come:
public void playSound(int i) {
try {
// ...
if (i == 3 || i == 4) {
if (i == 3) {
audioInputStream = AudioSystem
.getAudioInputStream(new File("Background.wav"));
clip3 = AudioSystem.getClip();
clip3.open(audioInputStream);
clip3.loop(Clip.LOOP_CONTINUOUSLY);
clip3.start();
settingSubMenuItem3.setEnabled(false);
settingSubMenuItem4.setEnabled(true);
}
if (i == 4) {
if (clip3 != null && clip3.isActive()) {
clip3.stop();
settingSubMenuItem3.setEnabled(true);
settingSubMenuItem4.setEnabled(false);
}
}
}
} catch (Exception e) {
System.out.println("Error with playing sound.");
e.printStackTrace();
}
}
.
Ancora una volta, rendendo AudioInputStream e Clip3 Campi di classe non statici.
Da parte, eviterei di usare numeri "magici" come 3 e 4 come stai facendo poiché questo potrebbe diventare un diavolo da debug da 6 mesi da ora.Dai invece a ogni jbutton la propria azione.Non merita meno.