javaswingjbuttonmp3jlayer

Jbuttons stucked when i play mp3 file


I'm trying to make an mp3 player using swing and when i play a song my jbutton play stays stucked and i can't press any other buttons from my app.I tried to use threads and it didn't worked, here is my play function code.

    public static void fplay() 
{
    Runnable fplay = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            if(!songs.isEmpty())
            {
                for(int j=0;j<songs.size();j++)
                {
                    System.out.println(path+"\\"+songs.get(j));
                    file = new File(path+"\\"+songs.get(j));
                    try {
                        fis = new FileInputStream(file);
                        player = new AdvancedPlayer(fis);
                        graphics.label.setText(songs.get(j).toString());
                        player.play();
                    }catch(Exception e) {

                    }
                }
            }else 
                JOptionPane.showMessageDialog(null, "No directory selected","Error",
                        JOptionPane.ERROR_MESSAGE);
        }};
        SwingUtilities.invokeLater(fplay);

}

Solution

  • when i play a song my jbutton play stays stucked and i can't press any other buttons from my app

    SwingUtilities.invokeLater(fplay);
    

    The invokeLater(...) method adds code to the end of Event Dispatch Thread (EDT). So this means the audio is still executing on the EDT and the GUI can't respond to events.

    Instead you need to start a separate Thread, so the audio doesn't prevent the GUI from responding to events.

    So you want to pass the Runnable to a Thread and start the Thread.

    Read the section from the Swing tutorial on Concurrency for more information about the EDT.

    I tried to use threads and it didn't worked

    Well, that is the proper solution. I can't guess what you did wrong, although you should never have an empty catch block. How will you know what the error is if you don't display anything?

    The tutorial on Concurrency also shows how to use a SwingWorker which could be a better solution for you.