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