У меня есть приложение Java с двумя кнопками: Start and Stop.Потеря контроля над моим приложением при чтении аудиофайла
Когда я нажимаю кнопку «Пуск», я читаю аудиофайл. Но есть проблема. Когда я читаю музыку, невозможно щелкнуть по другой кнопке. Я потерял контроль над своим приложением, пока не будет прочитан весь аудиофайл. Поэтому я не могу остановить чтение, нажав кнопку.
Я думаю, что мне нужно использовать поток, но у меня есть некоторые трудности, чтобы понять, как работает поток.
Вы можете мне помочь?
Вот моя серверная:
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;
}
}
}
Благодаря вам заранее за вашу помощь.
Слишком много кода, отвечая закрытыми глазами: вы читаете файл в разделе «Диспетчер событий», тем самым замораживая весь графический интерфейс. Используйте SwingWorker для загрузки файла. –
кажется 'sound.play()' не является асинхронным. – UmNyobe