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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top