我有一个Java应用程序,有2个按钮:Start和Stop。
当我点击“开始”按钮时,我读取了一个音频文件。但有一个问题。当我阅读音乐时,无法点击其他按钮。在读取整个音频文件之前,我失去了对应用程序的控制权。所以我无法通过点击我的按钮来停止阅读。
我认为我必须使用一个线程,但是我很难理解线程是如何工作的。
你能帮我吗?
这是我的ServerBoard:
public class ServerBoard extends JFrame
{
private TCPServer tcpserver;
private Sound sound;
private JTextArea messagearea;
private JButton startserver;
private JButton playmusic;
private JButton stopmusic;
/** CONSTRUCTEUR **/
public ServerBoard(int l, int h)
{
...
}
/** Initialisation de la fenetre **/
public void initialize()
{
...
}
/**********************************************************************************************
************************************** ADD PANELS **************************************
**********************************************************************************************/
private JPanel createPanelEast()
{
...
return panelEast;
}
/**********************************************************************************************
************************************* ADD LISTENERS ************************************
**********************************************************************************************/
private class ServerBoardListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String namebutton=e.getActionCommand().trim();
if(namebutton.equals("START SERVER"))
{
startServer();
}
else if(namebutton.equals("PLAY MUSIC"))
{
playMusic();
}
else if(namebutton.equals("STOP MUSIC"))
{
stopMusic();
}
}
}
/**********************************************************************************************
****************************************** METHODS ******************************************
**********************************************************************************************/
// METHODE POUR DEMARRER LE SERVEUR
public void startServer()
{
// Une fois clique, on desactive le bouton
startserver.setEnabled(false);
// On cree l'objet OnMessageReceved demande par le constructeur de TCPServer
tcpserver=new TCPServer(new TCPServer.OnMessageReceived()
{
public void messageReceived(String message)
{
messagearea.append(message);
}
});
tcpserver.start();
}
// METHODE POUR LIRE UN FICHIER AUDIO
public void playMusic()
{
System.out.println("lecture de son");
try
{
Sound sound = new Sound("C:/Documents and Settings/cngo/Bureau/Stage-Save/TCPIP_AndroidJava/TCPIP_V6_Sound/OpeningSuite.mp3");
System.out.println("playing : " + sound.isPlaying());
sound.play();
System.out.println("playing : " + sound.isPlaying());
}
catch (Exception e){e.printStackTrace();}
}
// STOP LA MUSIQUE
public void stopMusic()
{
System.out.println("arret de la musique");
try
{
sound.stop();
}
catch (Exception e) {e.printStackTrace();}
}
}
这是我的Sound.class:
public class Sound
{
private boolean isPlaying = false;
private AdvancedPlayer player = null;
public Sound(String path) throws Exception
{
InputStream in = (InputStream)new BufferedInputStream(new FileInputStream(new File(path)));
player = new AdvancedPlayer(in);
}
public boolean isPlaying()
{
return isPlaying;
}
public void play() throws Exception
{
if (player != null)
{
isPlaying = true;
player.play();
}
}
public Sound(String path,PlaybackListener listener) throws Exception
{
InputStream in = (InputStream)new BufferedInputStream(new FileInputStream(new File(path)));
player = new AdvancedPlayer(in);
player.setPlayBackListener(listener);
}
public void play(int begin,int end) throws Exception
{
if (player != null)
{
isPlaying = true;
player.play(begin,end);
}
}
public void stop() throws Exception
{
if (player != null)
{
player.stop();
isPlaying = false;
}
}
}
先谢谢你的帮助。
答案 0 :(得分:1)
使用基于Java Sound的Clip
。示例代码可以在Java Sound info. page上看到。它在守护进程Thread
中运行,因此不会阻止事件调度线程。
..如果我理解,Java Sound仅用于采样音频数据?
MP3 是采样音频数据!鉴于它是MP3,您应该阅读整个 Java声音信息。页面,清楚地解释了如何在JSE中提供对MP3的支持。
我的应用程序需要一些轻巧,极简的功能,这使我能够阅读大型音频文件和/或音频流。
行。如果它很大,你需要一个BigClip
。可以是其他评论中建议的SwingWorker
。