2016-06-11 4 views
-3

Ich habe an diesem Code für eine wirklich lange Zeit gearbeitet und ich kann einfach nicht mein Problem herausfinden. ich möchte in der lage sein, eine liste von liedern nacheinander abzuspielen, und ich dachte, ich könnte das mit einer einfachen rekursiven methode tun, die die durchschnittliche länge eines liedes verzögert und es das nächste lied aufrufen und abspielen lässt. .. Es spielt aber nur das allererste Lied und hört danach auf und es passiert nichts mehr ... Ich habe zahllose Leute gebeten, das anzuschauen und niemand kann mir helfen .. Und nein, das ist kein Schulprojekt, das ist es ein Musik-Player, den meine Mutter gerne auf einer Party am kommenden Wochenende nutzen würde, also ist das wie bei meinem letzten Versuch ... Jede Hilfe wäre sehr willkommen !!!Warum spielt mein Programm den nächsten Song im Array nicht ab?

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 Ich werde Sie nicht fragen, warum Ihre Mutter möchte, dass Sie diese verwenden, anstatt spotify ... egal ... wo dieser Code herkommt? Hast du versucht es zu debuggen? Warum denkst du, dass thread.sleep (5 * 60 * 1000) das Problem verursacht? – Paolof76

+0

Ich denke, das verursacht das Problem, denn bevor ich das hinzugefügt habe, hat die Methode funktioniert, aber die Songs würden übereinander gespielt. Alles, was ich zu tun versuchte, war, sie auseinander zu halten, so dass einer spielen würde und dann der nächste und so weiter. – amich

Antwort

2

Es scheint, Ihr Code aus dem gleichen Grunde ist dies nicht der Fall:

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

Gibt folgenden:

0 
0 
0 
0 
0 

Ihre Zuhörer haben ein x Feld, dass Ihre sind durch den Wert zwischen den Methoden übergeben. Sie sollten das x Argument auf playMusic() entfernen, so dass es jedes Mal, wenn es x inkrementiert, stattdessen das Objektfeld verwenden würde.

+0

Verwenden Sie playMusic (++ x); –

+0

Nein, es hilft nicht – everton

+0

Logisch in meinem Kopf, die 1 jedes Mal drucken sollte .. Also was Sie sagen, ist, dass ich zuerst X inkrementieren und dann die Methode aufrufen? – amich

Verwandte Themen