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 : «
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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" : «

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : «
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.