Bonjour j'essaye actuellement d'améliorer mon code, et en me relisant j'ai vu que je faisait un truc plutôt bizarre (mais qui me provoquait pas d’exception !)
Ma situation est la suivante j'ai une listView contenant 4 cartes, lorsque le joueur choisie une carte cette dernière et supprimée de la liste et ainsi de suite jusqu’à qu'il n'y est plus de carte et que nouvelle fenêtre s'ouvre.
En conséquent j'ai décider de mettre en place un "addListener" sur la liste view du nom de listDeCarte...
La méthode tour et celle qui supprime une carte de la liste et c'est au moment de cette suppression que l'erreur survient ...
Voici le code afin que vous voyer mieux la situation :
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 listDeCarte.getSelectionModel().selectedItemProperty().addListener((__, ov, nv) -> { if (nv != null) { Object objetSelectionne = listDeCarte.getSelectionModel().getSelectedItem(); while(objetSelectionne==null){ objetSelectionne = listDeCarte.getSelectionModel().getSelectedItem(); } carteJoueur= (Carte) objetSelectionne; carteAdversaire = manageur.choixCarteAdverse(listCarteAdverse); try { resultatTour = manche.tour(carteAdversaire, carteJoueur); } catch (Exception e) { e.printStackTrace(); } afficherResultatTour(resultatTour, carteJoueur, carteAdversaire); if(listCarteAdverse.size()==0 && listCarteJoueur.size()==0){ affichageFinDePartie(manche); Stage stageTableauDesScores = new Stage(); FXMLLoader leLoader = new FXMLLoader(getClass().getResource("/fxml/TableauDesScores.fxml")); leLoader.setController(new TableauDesScores(manageur, joueur)); Parent root = null; try { root = leLoader.load(); } catch (IOException e) { e.printStackTrace(); } Scene scene = new Scene(root); scene.getStylesheets().add(getClass().getResource("/css/application.css").toExternalForm()); stageTableauDesScores.setScene(scene); stageTableauDesScores.setTitle("Tarot Africain"); closeStage(controler); stageTableauDesScores.show(); } } });
la méthode tour :
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 /** * Méthode qui permet de définir quel joueur est le vainqueur du tour, * Cette méthode permet aussi de supprimer la carte jouer par le joueur et le joueur adverse. * @param carteAdverse carte jouer par le joueur adverse * @param carteJoueur carte jouer par le joueur * @return false si le joueur à perdu le tour sinon retourne vrai * @throws Exception le programme n'est sensé jamais arriver ici, signifie que les cartes jouer par le joueur * et le jouer adverse sont identiques. */ public boolean tour(Carte carteAdverse, Carte carteJoueur) throws Exception { if (carteAdverse.getValeur() > carteJoueur.getValeur()) { setNbPartieGagneeAdverse(getNbPartieGagneeAdverse() + 1); carteListAdverse.remove(carteAdverse); carteListJoueurObs.remove(carteJoueur); //PROVOQUE L'ERREUR return false; } else { if(carteJoueur.getValeur() > carteAdverse.getValeur()) { setNbPartieGagneeJoueur(getNbPartieGagneeJoueur() + 1); carteListAdverse.remove(carteAdverse); carteListJoueurObs.remove(carteJoueur); //PROVOQUE L'ERREUR return true; } else{ throw new Exception("Problème, la carte jouer par le joueur et le joueur adverse et la même"); } } }
J'ai fait des recherches est j'ai vu que c'est un problème ce produit souvent est il est conseiller d'utiliser "Arrays.asList(split)" mais je ne voit pas ou utilisé dans mon code. De plus j'aimerais comprendre pourquoi cette erreur "survient" maintenant et pas avant quand je passait par un.
Code : Sélectionner tout - Visualiser dans une fenêtre à part onMouseClicked="#carteChoix"
Voici comment est crée ma carteListJoueurObs :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 /** * Liste de carte observable des carte du joueur */ private final ObservableList<Carte> carteListJoueurObs = FXCollections.observableArrayList(); private final ListProperty<Carte> carteListJoueur = new SimpleListProperty<>(carteListJoueurObs); /** * Ces différentes méthodes permet de modifiée la liste de joueur ou bien de la retournée. */ public ObservableList<Carte> getCarteListJoueur() {return carteListJoueur.get();} public ListProperty<Carte> carteListJoueurProperty() {return carteListJoueur;}
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 /** * Méthode qui permet de distribuer les cartes au deux joueurs * Cette méthode appelle la méthode "doRandom" de la classe "Jeu" * Elle récupére la liste de carte de "doRandom" puis la sépare en deux ( la liste de carte du joueur * et la liste de carte du joueur adverse). * @param nb_carte représente le nombre qu'a chaque joueur dans sa main * @param nbJoueur représente le nombre de personne qui joue */ protected void distribuer(int nb_carte, int nbJoueur) { List<Carte> listCarte; Jeu jeu = new Jeu(); int i = 0; listCarte = jeu.doRandom(nb_carte, nbJoueur); Iterator<Carte> it = listCarte.iterator(); while (it.hasNext()) { if (i < nb_carte) carteListJoueurObs.add(it.next()); else carteListAdverse.add(it.next()); i = i + 1; } }
Merci d'avance pour vos réponses.
Partager