当我播放 mp3 文件时 Jbuttons 卡住了

Jbuttons stucked when i play mp3 file

我正在尝试使用 swing 制作 mp3 播放器,当我播放歌曲时,我的 jbutton 播放卡住了,我无法按下 app.I 中的任何其他按钮,尝试使用线程但它没有成功了,这是我的播放功能代码。

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

}

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

SwingUtilities.invokeLater(fplay);

invokeLater(...) 方法将代码添加到 Event Dispatch Thread (EDT) 的末尾。所以这意味着音频仍在 EDT 上执行并且 GUI 无法响应事件。

相反,您需要启动一个单独的 Thread,因此音频不会阻止 GUI 响应事件。

所以您想将 Runnable 传递给 Thread 并启动 Thread

阅读有关 Concurrency 的 Swing 教程部分,了解有关 EDT 的更多信息。

I tried to use threads and it didn't worked

嗯,这是正确的解决方案。我猜不出你做错了什么,尽管你永远不应该有一个空的 catch 块。如果不显示任何内容,您怎么知道错误是什么?

Concurrency 上的教程还展示了如何使用 SwingWorker,这对您来说可能是更好的解决方案。