Bloquer les éléments d'une liste pendant un laps de temps...

Le
Foub31400
Bonjour,

je souhaite pouvoir 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 : «

JButton btnDebloquer = new JButton("Débloquer situation !");
btnDebloquer.addActionListener(new ActionListener(){@Override
public void actionPerformed(ActionEvent arg0) {
maListe.setBloquer(false);
}
}); ».

Si avant que je clique sur le bouton, on essaye d'ajouter des éléments
à ma liste, il faudrait que ces actions soient mis dans une file
d'attente jusqu'à que mon clique autorise l'accès à ma liste.

Savez-vous comment pourrais-je faire cela en java ?

J'ai essayé de me créer la classe "ArrayListPerso" : «

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 : «
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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Raphael Tagliani
Le #1599600
Bonjour,

Et si vous procédiez ainsi :
Créer une classe dans laquelle vous mettez un champ liste (LinkedList
p.ex), que vous utiliseriez comme pile.
Lors de l'ajout d'un élément, vous le mettez simplement dans la pile.
Cette classe devrait être un actionListener pour le bouton, et
lorsqu'elle reçoit l'événement 'Débloquer situation', ajouter les
éléments de la pile dans la liste finale.

Exemple (en pseudo java):

public class ArrayListPerso<T> extends ArrayList<T> implements
ActionListener {

private List stack;

ArrayListPerso() {
this.stack = new Stack();
}

@Override
public void actionPerformed(ActionEvent event) {
for(Object o : this.stack) {
this.add(o);
}
}

@Override
public void add(Object o) {
this.stack.add(o);
}

}

Si vous voulez que l'action soit automatique plutôt que contrôlée par un
bouton, utilisez simplement un timer pour générer l'action.

Bonne journée!

Foub31400 wrote:
Bonjour,

je souhaite pouvoir 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 : «

JButton btnDebloquer = new JButton("Débloquer situation !");
btnDebloquer.addActionListener(new ActionListener(){@Override
public void actionPerformed(ActionEvent arg0) {
maListe.setBloquer(false);
}
}); ».

Si avant que je clique sur le bouton, on essaye d'ajouter des éléments
à ma liste, il faudrait que ces actions soient mis dans une file
d'attente jusqu'à que mon clique autorise l'accès à ma liste.

Savez-vous comment pourrais-je faire cela en java ?

J'ai essayé de me créer la classe "ArrayListPerso" : «

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 : «
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.




Foub31400 wrote:
Bonjour,

je souhaite pouvoir 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 : «

JButton btnDebloquer = new JButton("Débloquer situation !");
btnDebloquer.addActionListener(new ActionListener(){@Override
public void actionPerformed(ActionEvent arg0) {
maListe.setBloquer(false);
}
}); ».

Si avant que je clique sur le bouton, on essaye d'ajouter des éléments
à ma liste, il faudrait que ces actions soient mis dans une file
d'attente jusqu'à que mon clique autorise l'accès à ma liste.

Savez-vous comment pourrais-je faire cela en java ?

J'ai essayé de me créer la classe "ArrayListPerso" : «

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 : «
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.


Jack
Le #1599599
Bonjour,

Et si vous procédiez ainsi :
Créer une classe dans laquelle vous mettez un champ liste (LinkedList
p.ex), que vous utiliseriez comme pile.
Lors de l'ajout d'un élément, vous le mettez simplement dans la pile.
Cette classe devrait être un actionListener pour le bouton, et
lorsqu'elle reçoit l'événement 'Débloquer situation', ajouter les
éléments de la pile dans la liste finale.

Exemple (en pseudo java):

public class ArrayListPerso<T> extends ArrayList<T> implements
ActionListener {


Plutôt que de créer des sous types, pourquoi ne pas mettre 3 champs dans
le dialogue ? Un boolean, la pile, et la liste. Quand le booleen
"bloquer" est a true, les éléments sont ajoutés à la pile, et au moment
de débloquer, le contenu de la pile est ajouté à la liste.

Cela permet:
- de ne pas créer de sous classe inutilement
- de ne pas mélanger le code graphique (Swing) et le code des données
- de ne pas avoir de synchronisation comliquée

Raphael Tagliani
Le #1599598
Bonjour,

en effet, suivez les conseils de Jack pour les types. Je ne m'en suis
pas du tout occupé dans mon exemple, j'ai juste montré le concept.

Jack wrote:
Bonjour,

Et si vous procédiez ainsi :
Créer une classe dans laquelle vous mettez un champ liste (LinkedList
p.ex), que vous utiliseriez comme pile.
Lors de l'ajout d'un élément, vous le mettez simplement dans la pile.
Cette classe devrait être un actionListener pour le bouton, et
lorsqu'elle reçoit l'événement 'Débloquer situation', ajouter les
éléments de la pile dans la liste finale.

Exemple (en pseudo java):

public class ArrayListPerso<T> extends ArrayList<T> implements
ActionListener {


Plutôt que de créer des sous types, pourquoi ne pas mettre 3 champs dans
le dialogue ? Un boolean, la pile, et la liste. Quand le booleen
"bloquer" est a true, les éléments sont ajoutés à la pile, et au moment
de débloquer, le contenu de la pile est ajouté à la liste.

Cela permet:
- de ne pas créer de sous classe inutilement
- de ne pas mélanger le code graphique (Swing) et le code des données
- de ne pas avoir de synchronisation comliquée



Foub31400
Le #1599597
On 16 mar, 12:17, Raphael Tagliani
Bonjour,

en effet, suivez les conseils de Jack pour les types. Je ne m'en suis
pas du tout occupé dans mon exemple, j'ai juste montré le concept.

Jack wrote:
Bonjour,

Et si vous procédiez ainsi :
Créer une classe dans laquelle vous mettez un champ liste (LinkedList
p.ex), que vous utiliseriez comme pile.
Lors de l'ajout d'un élément, vous le mettez simplement dans la pil e.
Cette classe devrait être un actionListener pour le bouton, et
lorsqu'elle reçoit l'événement 'Débloquer situation', ajouter l es
éléments de la pile dans la liste finale.

Exemple (en pseudo java):

public class ArrayListPerso<T> extends ArrayList<T> implements
ActionListener {


Plutôt que de créer des sous types, pourquoi ne pas mettre 3 champs dans
le dialogue ? Un boolean, la pile, et la liste. Quand le booleen
"bloquer" est a true, les éléments sont ajoutés à la pile, et au moment
de débloquer, le contenu de la pile est ajouté à la liste.

Cela permet:
- de ne pas créer de sous classe inutilement
- de ne pas mélanger le code graphique (Swing) et le code des donnée s
- de ne pas avoir de synchronisation comliquée



merci bcp pour vos réponses...
Très intéressant, je vais pas hésiter à m'en inspirer...



Publicité
Poster une réponse
Anonyme