[Débutant] De tableau bidimensionel de JLabel vers deux ArrayList pseudo liées.
Bonsoir,
Je cherche à améliorer le code de mon application afin de le rendre propre et clair. L'objectif final étant de coder un jeu de memory.
Ci-dessous une partie de code commenté :
Code:
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
| // nombreImageTotal, est une variable qui dépend d'une autre classe, qui varie entre min16 et de environs 20 (cela dépend de moi et est codé en dur.
private static JLabel[][] tabTotal = new JLabel[2][nombreImageTotal * 2]; //le *2 sert parce que je souhaite avoir deux fois la même image.
public static ArrayList<JLabel> list = new ArrayList<>();
public static ArrayList<JLabel> listDos = new ArrayList<>();
//ici la fonction qui servira à créer des labels. Je la poste en premier pour plus de clarté.
public static JLabel createJLabel (String i){
JLabel jl = new JLabel(new ImageIcon(CreationVariable.class.getResource("/image/" + getTheme() + i + ".png")));
return jl;
}
//Création de la première partie du tableau, car je n'ai pas trouvé le moyen de le faire en une seule fois...
// aussi un point important, je pose un "setText" qui est vital pour la suite.
for(int i = 0 ; i < 2 ; i++){
for ( int j = 0 ; j < nombreImageTotal; j++ ){
if ( i == 0 ) {
tabTotal[i][j] = createJLabel( Integer.toString(j+1) );
tabTotal[i][j].setText(j+1);
}else{
tabTotal[i][j] = createJLabel( "dos" );
tabTotal[i][j].setText((j+1);
}}
}
//dans cette deuxième partie je n'ai pas trouvé mieux que de refaire une boucle afin de simplement "doubler" le tableau
for(int i = 0 ; i < 2 ; i++){
for ( int j = nombreImageTotal ; j < nombreImageTotal * 2 ; j++ ){
if ( i == 0 ) {
tabTotal[i][j] = createJLabel( Integer.toString(j+1-nombreImageTotal ));
tabTotal[i][j].setText(j+1- nombreImageTotal);
}else{
tabTotal[i][j] = createJLabel( "dos" );
tabTotal[i][j].setText(j+1- nombreImageTotal);
}}
}
// Ces deux listes sont clear() dans une autre partie du programme
// elles me servent par la suite à insérer ces jlabel dans un panel dans une boucle.
for(int i = 0; i < nombreImageTotal * 2 ; i++){
list.add(tabTotal[0][i]); // [0][i] sert a récupérer la liste d'image.
listDos.add(tabTotal[1][i]);} // [1][i] sert pour récupérer une image de carte retourné avec le fameux 'setText" identique à la ligne de dessus
//NiveauDifficultee est fixé par un radio bouton dans un menubar et en cas de modification en cour de partie, relance "l'initialisation" du jeux.
int b = (list.size() / 2) - (NiveauDifficultee / 2);
int d = nombreImageTotal;
//ici je tire des cartes aléatoirement que j'efface de mes listes, mais comme j'ai deux fois les mêmes cartes je dois effacer deux fois.
for(int i = 0 ; i < b ; i++) {
int a = (int) (Math.random() * (list.size() / 2) );
list.remove(a + d);
list.remove(a);
listDos.remove(a + d);
listDos.remove(a);
d--; }
// j'ai pompé ce code sur le net, mais je n'ai pas compris comment il fonctionnait
// ce que je sais, c'est qu'il permet de mélanger plusieurs ArrayList en même temps sans permutation
long seed = System.nanoTime();
Collections.shuffle(list, new Random(seed));
Collections.shuffle(listDos, new Random(seed)); |
Pour ceux que ça intéresse, voici la boucle qui affiche les deux ArrayList :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| for(int i = 0; i < list.size() ; i++){
listDos.get(i).setBounds(tabLabX[i], tabLabY[i], 150, 200);
listDos.get(i).setName("" + (i));
list.get(i).setBounds(tabLabX[i], tabLabY[i], 150, 200);
list.get(i).setName("" + (i));
list.get(i).setVisible(false);
listDos.get(i).addMouseListener(new ListenerPerso());
getPanJeux().add(listDos.get(i));
getPanJeux().add(list.get(i));
} |
Ainsi que le Listener.
Code:
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 63 64
| static Boolean clique = false;
static public String textClique;
static public String nomClique;
static public String ancienTextClique;
static public String ancienNomClique;
static public int NombreCarteTrouver;
int NiveauDifficultee = CreationVariable.getNiveauDifficultee();
ArrayList<JLabel> list = CreationVariable.getList();
ArrayList<JLabel> listDos = CreationVariable.getListDos();
public void mouseClicked(MouseEvent me) {
textClique = ((JLabel) me.getSource()).getText();
nomClique = ((JLabel) me.getSource()).getName();
// System.out.println(textClique);
// System.out.println(nomClique);
listDos.get(Integer.parseInt(nomClique)).setVisible(false);
list.get(Integer.parseInt(nomClique)).setVisible(true);
if ( clique == true) {
try {
Thread.sleep(100);
} catch (InterruptedException e1) { //cette tempo est juste un test car il y a des fois certains bugs.
// TODO Auto-generated catch block
e1.printStackTrace();
}
clique = false;
if ( textClique.equals(ancienTextClique) == false ) {
String az = ancienNomClique;
String aze = nomClique;
new TimerEDT (900, e-> (list.get(Integer.parseInt(aze)).setVisible(false)));
new TimerEDT (900, e-> (list.get(Integer.parseInt(az)).setVisible(false)));
new TimerEDT (900, e-> (listDos.get(Integer.parseInt(aze)).setVisible(true)));
new TimerEDT (900, e-> (listDos.get(Integer.parseInt(az)).setVisible(true)));
}else {
NombreCarteTrouver = NombreCarteTrouver +2;
if (NombreCarteTrouver == NiveauDifficultee) {
System.out.println("Gagner");
Fenetre.getPanJeux().removeAll();
JLabel vic = new JLabel(new ImageIcon(CreationVariable.class.getResource("/image/victoire.png")));
vic.setBounds(10, 10, 429, 415);
vic.setVisible(true);
Fenetre.getPanJeux().add(vic);
}
}
}else {
clique = true;
}
ancienTextClique = textClique;
ancienNomClique = nomClique;
// Thread t = new ThreadTest();
// t.start();
Fenetre.getPanJeux().repaint();
} |
Il est important de noter que j'en suis seulement à la version "preview" surtout dans le code du listener et que la question principale se trouve dans le premier "code".
Quelqu'un saurait-il m'indiquer comment améliorer celui-ci ?
Merci d'avance pour votre aide.