Jbuttons застряли, когда я играю mp3-файл

Я пытаюсь сделать mp3-плеер, используя свинг, и когда я играю песню, моя игра jbutton зависает, и я не могу нажимать какие-либо другие кнопки из своего приложения. Я пытался использовать потоки, и это не сработало, вот мой код функции воспроизведения.

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

}

person Catalin Flavius    schedule 25.01.2018    source источник


Ответы (1)


когда я играю песню, воспроизведение jbutton зависает, и я не могу нажимать другие кнопки в своем приложении.

SwingUtilities.invokeLater(fplay);

Метод invokeLater(...) добавляет код в конец Event Dispatch Thread (EDT). Таким образом, это означает, что звук все еще выполняется на EDT, а графический интерфейс не может реагировать на события.

Вместо этого вам нужно запустить отдельный Thread, чтобы звук не мешал GUI реагировать на события.

Итак, вы хотите передать Runnable Thread и запустить Thread.

Дополнительные сведения см. в разделе руководства Swing по Concurrency. про ЭДТ.

Я пытался использовать потоки, и это не сработало

Что ж, это правильное решение. Я не могу догадаться, что вы сделали не так, хотя у вас никогда не должно быть пустого блока catch. Как вы узнаете, в чем ошибка, если вы ничего не отображаете?

Учебник на Concurrency также показывает, как использовать SwingWorker, который может быть лучшим решением для вас.

person camickr    schedule 25.01.2018