Bonjour,
je souhaite pouvoir bloquer/débloquer les éléments présents dans une java.util.List jusqu'à que l'utilisateur clique sur un bouton par exemple.
Par exemple, j'aimerais pouvoir écrire l'action suivante pour mon bouton : «
1 2 3 4 5 6 7
|
JButton btnDebloquer = new JButton("Débloquer situation !");
btnDebloquer.addActionListener(new ActionListener(){@Override
public void actionPerformed(ActionEvent arg0) {
maListe.setBloquer(false);
}
}); |
».
Au démarrage du test (les éléments de la liste sont bloqués), si on essaye d'ajouter des éléments à ma liste, il faudrait que ces actions soient mis dans une file d'attente jusqu'à que je clique sur le bouton btnDebloquer pour autoriser l'accès à ma liste.
Savez-vous comment pourrais-je faire cela en java ?
J'ai essayé de me créer la classe "ArrayListPerso" : «
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| package listPerso;
import java.util.ArrayList;
public class ArrayListPerso<T> extends ArrayList<T> {
/** Version de sérialisation */
private static final long serialVersionUID = 1L;
/** Bloquer l'ajout d'élement ? */
private boolean bloquer = false;
/**
* Constructeur par défaut.
*/
public ArrayListPerso() {
super();
}
/**
* Retourne un boolean pour indiquer si on bloque l'ajout d'élément
* dans la liste.
*
* @return true la liste des éléments est bloqué, false on peut
modifier la liste.
*/
public boolean isBloquer() {
return bloquer;
}
/**
* Définit l'état de la liste : bloque-t-on tout ajout d'élément ou
pas ?
* @param bloquer true on bloque tout ajout d'élément, false on
autorise tout modification.
*/
public void setBloquer(boolean bloquer) {
if ((bloquer == false) && (this.bloquer == true)) {
this.bloquer = bloquer;
this.notifyAll();
} else {
this.bloquer = bloquer;
}
}
@Override
public boolean add(T arg0) {
if (bloquer) {
System.out.println("L'ajout de l'élément " + arg0 + " est
suspendu !");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Ajout de l'élément " + arg0 + " effectué !");
return super.add(arg0);
}
} |
»
et la classe de test : «
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
| public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
final ArrayListPerso<String> maListe = new ArrayListPerso<String>();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton btnDebloquer = new JButton("Débloquer situation !");
btnDebloquer.addActionListener(new ActionListener(){@Override
public void actionPerformed(ActionEvent arg0) {
maListe.setBloquer(false);
}
});
frame.getContentPane().add(btnDebloquer, BorderLayout.CENTER);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
maListe.add("allo");
maListe.setBloquer(true);
maListe.add("coucou");
} |
».
Voici les informations affichées dans la console : «
Exception in thread "main" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at listPerso.ArrayListPerso.add(ArrayListPerso.java:50)
at TestFabienListePerso.main(TestFabienListePerso.java:45)
Ajout de l'élément allo effectué !
L'ajout de l'élément coucou est suspendu !
»
alors que je souhaiterais avoir : «
Ajout de l'élément allo effectué !
L'ajout de l'élément coucou est suspendu !
», puis, quand je clique sur le bouton : «
Ajout de l'élément coucou effectué !
».
Merci d'avance pour votre aide.
F.
Partager