当我播放 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,这对您来说可能是更好的解决方案。
我正在尝试使用 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,这对您来说可能是更好的解决方案。