2016-06-11 3 views
-3

Je travaille sur ce code depuis très longtemps et je n'arrive pas à comprendre mon problème. Je veux être capable de jouer une liste de chansons les unes après les autres et j'ai pensé que je serais capable de le faire avec une méthode récursive simple qui retarde la durée moyenne d'une chanson, et l'appelle la chanson suivante et la joue. .. Cependant, il ne joue que la première chanson, puis s'arrête après cela et rien d'autre ne se passe ... J'ai demandé à d'innombrables personnes de regarder cela et personne ne peut m'aider .. Et non ce n'est pas un projet d'école, il est un lecteur de musique que ma mère voudrait que j'utilise lors d'une fête le prochain week-end à venir, alors c'est comme mon dernier effort ... Toute aide serait grandement appréciée !!!Pourquoi mon programme ne joue-t-il pas la prochaine chanson dans le tableau?

private JLabel messageLabel; 
private JButton playlist; 
private JPanel panel; 
BufferedImage image; 
AudioStream audioStream1, audioStream2, audioStream3; 
//Object[] music = new Object[3]; 
private final int WINDOW_WIDTH = 800; 
private final int WINDOW_HEIGHT = 525; 

// File destinationss  
private String s1 = "C:\\Users\\Tony\\Desktop\\Java\\NetBeansProjects\\Gui Stuff\\src\\No_Pressure.wav"; 
private String s2 = "C:\\Users\\Tony\\Desktop\\Java\\NetBeansProjects\\Gui Stuff\\src\\Grateful_Dead_-_Touch_of_Grey.wav"; 
private String s3 = "C:\\Users\\Tony\\Desktop\\Java\\NetBeansProjects\\Gui Stuff\\src\\Stairway_to_Heaven_Led_Zeppelin_Lyrics.wav"; 

InputStream in1 = new FileInputStream(s1); 
InputStream in2 = new FileInputStream(s2); 
InputStream in3 = new FileInputStream(s3); 
private ArrayList music; 

public JukeBoxWithArrays() throws IOException { 

    music = new ArrayList(); 

    audioStream1 = new AudioStream(in1); 
    audioStream2 = new AudioStream(in2); 
    audioStream3 = new AudioStream(in3); 

    music.add(audioStream1); 
    music.add(audioStream2); 
    music.add(audioStream3); 

    setTitle("Juke Box Playlist"); 
    setSize(WINDOW_WIDTH, WINDOW_HEIGHT); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    messageLabel = new JLabel("Click the Button to play the playlist"); 

    // Create the Playlist button 
    playlist = new JButton("Playlist number 1"); 

    // Register the event Listener 
    playlist.addActionListener(new PlaylistListener()); 

    // Create the panel 
    panel = new JPanel(); 
    image = ImageIO.read(new File("C:\\Users\\Tony\\Desktop\\Java\\NetBeansProjects\\Gui Stuff\\src\\jukebox2.jpg")); 
    panel.add(messageLabel); 
    panel.add(playlist); 
    panel.add((new JLabel(new ImageIcon(image)))); 

    // Add the panel to the Content Pane 
    add(panel); 

    // Display the Window 
    setVisible(true); 
} 

private class PlaylistListener implements ActionListener { 

    int x = 0; 

    public void actionPerformed(ActionEvent e) { 

     try { 
      playMusic(x); 

     } catch (InterruptedException ex) { 
      Logger.getLogger(JukeBoxWithArrays.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public void playMusic(int x) throws InterruptedException { 

     if (x > music.size()) { 
      AudioPlayer.player.stop((InputStream) music.get(x)); 

     } else { 
      AudioPlayer.player.start((InputStream) music.get(x)); 

     } 
     Thread.sleep(5 * 60 * 1000); // I believe this is where I am running into my problem 
     playMusic(x++); 

    } 

} 

@SuppressWarnings("restriction") 
public static void main(String[] args) throws Exception { 

    JukeBoxWithArrays jbwa = new JukeBoxWithArrays(); 
    jbwa.pack(); 

} 

}

+1

OK Je ne vous demanderai pas pourquoi votre mère veut que vous utilisiez ceci au lieu de spotify ... de toute façon ... d'où vient ce code? Avez-vous essayé de le déboguer? Pourquoi pensez-vous que thread.sleep (5 * 60 * 1000) cause le problème? – Paolof76

+0

Je pense que cela cause le problème parce qu'avant d'ajouter cela, la méthode fonctionnait, mais les chansons jouaient les unes sur les autres. Donc tout ce que j'essayais de faire était de les espacer afin que l'on puisse jouer, puis le suivant et ainsi de suite – amich

Répondre

2

Il semble que votre code est défaillant pour la même raison ceci:

private static int x = 0; 

public static void main(String[] args) throws ParseException { 
    int x = 0; 
    doSomething(x); 
    doSomething(x); 
    doSomething(x); 
    doSomething(x); 
    doSomething(x); 
} 

private static void doSomething(int x) { 
    System.out.println(x++); 
} 

Sorties ceci:

0 
0 
0 
0 
0 

Votre Listener a un champ x, que votre sont passant par la valeur entre les méthodes. Vous devez supprimer l'argument x sur playMusic(), donc chaque fois qu'il incrémente x, il utilisera le champ d'objet à la place.

+0

Utiliser playMusic (++ x); –

+0

Non, ça n'aide pas – everton

+0

Logiquement dans ma tête qui devrait imprimer 1 à chaque fois .. Donc ce que vous dites est que je dois d'abord incrémenter X puis appeler la méthode? – amich