Je ne vais pas répondre à la question mais faire des remarques.
Déjà, on utilise le "code balise" comme:
Et on n'oublie pas l'indentation:
1 2 3 4 5 6 7
|
public MaClasse{
public void maMethode(){
}
} |
Si c'est lisible, on prendra peut-être la peine de lire le code.
Ensuite, on différentie le rôle des classe selon le principe SOLID (S de SOLID).
https://fr.wikipedia.org/wiki/SOLID_%28informatique%29
Il faut donc une seule classe pour la lecture.
Le mieux est de définir le contrat:
1 2 3 4 5 6
|
public interface FichierWav{
void start();
void stop();
} |
Note qu'en réalité, il peut y avoir diverses exceptions lancées, et qu'il faudrait les spécifier dans le contrat.
A l'extérieur, on ne voit que le contrat, et on n'a pas à savoir comment ça marche.
Le contrat s'éxécute effectivement dans un Thread indépendant.
Là aussi, la programmation concurrente, c'est un peu compliqué.
Le plus important, c'est de différentier la tache (Runnable) et l’exécution de la tâche.
Pour cela, on utilise le frameword exécutor.
https://www.jmdoudoux.fr/java/dej/chap-executor.htm
Donc l'implémentation devient:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
public class FichierWavImpl implements FichierWav, Runnable{
private boolean isReading;
private ExecutorService executorService;
public FichierWavImpl(){
isReading = false;
}
@Override
public void run(){
while(isReading){
//Code de lecture
}
}
@Override
public void start(){
if(!isReading){
isReading = true;
executorService = Executors.newSingleThreadExecutor();
executorService.execute(this);
}
}
public void stop(){
if(isReading){
isReading = false;
executorService.shutdown();
}
}
} |
Ensuite, reste à faire l'IHM. L'IHM utilise le principe d'injection de dépendance (le D de SOLID).
en résumé, l'IHM ne peut fonctionner que si on injecte le fichier WAV.
Donc en résumé,
1 2 3 4 5 6 7 8 9 10 11
|
public class MonIHM{
private final FichierWav fichierWav;
public FichierWav(FichierWav fichierWav){
this.fichierWav = fichierWav;
}
//Le code pour construire l'IHM
} |
On note que l'IHM ne voit que un contrat, qu'il peut start ou stop.
Pour rappel, les boutons sont basés sur le Design pattern Observer/Observable:
https://fr.wikipedia.org/wiki/Observ...de_conception)
On n'a plus que à ajouter l'action aux boutons.
Notez que l'on peut d'ailleurs en ajouter plusieurs.
On va utiliser, pour la lisibilité du code, les lambda expressions.
1 2
|
boutonStart.addActionListener(e -> fichierWav.start()) |
1 2
|
boutonStop.addActionListener(e -> fichierWav.stop()) |
Partager