Problème d'affichage d' images sur un tableau de JButton

Rekkina Messages postés 1 Date d'inscription dimanche 26 avril 2015 Statut Membre Dernière intervention 26 avril 2015 - Modifié par Whismeril le 26/04/2015 à 08:06
 Rekkina - 4 mai 2015 à 01:58
Bonjour,
Je débute dans l'informatique et je me suis lancé dans le jeu Bejewed (Candy crush) mais je rencontre un gros problème pour afficher mes images.
Le problème est dans les setIcon() et setDisabledIcon() au moment du [m.getTesbouton(i,j)] l'erreur est qu'il demande un entier (int) et lorsque je met un entier il me met Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException .
C'est peut être une erreur de débutant mais si quelqu'un pourrait m'aider sa me rendrais un énorme service car je suis bloqué dessus depuis 3 jours.
Merci d'avance et excusé moi du code très sale mais je débute.
Voici mon code (j'utilise plusieurs classes : une model, une page et une Appli où on trouve le main) :

 public void initattribut(){
        TesBoutons = new JButton[8][8];
        for (int i=0; i<8; i++) {
            for (int j = 0; j < 8; j++) {
                TesBoutons[i][j] = new JButton("");
                TesBoutons[i][j].setActionCommand("" + i + "" + j);
                TesBoutons[i][j].setPreferredSize(new Dimension(80, 80));
                TesBoutons[i][j].setIcon(m.getListeImages()[m.getTesbouton(i,j)]);
                TesBoutons[i][j].setDisabledIcon(m.getListeImages()[m.getTesbouton(i,j)]);
            }//fin du for des j
        }//fin du for des i


Avec les gets suivant :

public ImageIcon[] getListeImages() {
        charger();
        return listimage;
    }
    public JButton getTesbouton(int i,int j) {
        return v.TesBoutons[i][j];
    }

Et la méthode charger() pour charger les images :

public void charger(){
        File folder = new File("IHM2/src");
        listimage = new ImageIcon[8];
        int cpt = 0;



        for(final File fileEntry : folder.listFiles()){

            if(fileEntry.getName().charAt(0) == '.')
                continue;
            listimage[cpt] = new ImageIcon("IHM2/src"+'/' + fileEntry.getName());
            cpt++;
        }



    }


EDIT: Ajout de la coloration syntaxique.

6 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
27 avril 2015 à 08:05
Salut,

Si tu affiches la stacktrace de ton exception tu auras la ligne qui pose problème.


Sinon,

Dans ta méthodes 'initattribut' tu fais référence à 'm' mais il vient d'où 'm' ?
Dans ta méthodes 'getTesbouton' tu fais référence à 'v' mais il vient d'où 'v' ?
Au passage tu devrais protéger ta méthode 'charger' parce que là à chaque appel de getListeImages tu nous refait une nouvelle instance de la terre entière et tu re charges tes images depuis le disque ...


0
Salut et merci de t'être penché sur mon problème .
Les lignes qui affiche une erreur sont celle ci :

TesBoutons[i][j].setIcon(m.getListeImages()[m.getTesbouton(i,j)]);
TesBoutons[i][j].setDisabledIcon(m.getListeImages()[m.getTesbouton(i,j)]);

Il me dit que [m.getTesbouton(i,j)] doit retourné un entier et c'est cela que je ne comprend pas.
Si tu vois quel est l'erreur dans la méthode ou une autre façon d'afficher les Images avec les méthodes setIcon() et setDisabledIcon() merci de m'en informer.
Sinon les m et v sont l'appelle des class Vue et Model pour pouvoir utilisé ces attribut.
Voici les 2 classes :

Vue.java

import javax.swing.*; // Pour les composants graphiques que l'on ajoutera dans la m?thode creerWidget
import java.awt.*; // Pour la JFrame
import javax.swing.JButton;

public class Vue extends JFrame {
public JButton [][] TesBoutons;
JLabel level;
JLabel trie;
JLabel score;
int i;
int j;
Model m;

public Vue() {


initattribut();
creerWidget();
setSize(900, 900); // Fixe la taille par dfaut
setVisible(true); // Affiche la fenetre
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// Gestion de la fermeture
setTitle("Bejeweled");
}

public void creerWidget() {
JPanel a = new JPanel();
a.add(level);

JPanel b = new JPanel();
b.add(trie);
JPanel c = new JPanel();
c.add(score);
JPanel d = new JPanel(new FlowLayout(FlowLayout.RIGHT, 100, 60));
d.setLayout(new BoxLayout(d, BoxLayout.X_AXIS));
d.add(a);
d.add(b);
d.add(c);
JPanel e = new JPanel();
for ( i=0; i<8; i++){
for( j = 0; j<8; j++) {
e.add(TesBoutons[i][j]);


//puis leurs tailles, couleurs, aspect, etc.
}//fin du for des j
}//fin du for des i

e.setLayout(new GridLayout(8, 8));
JPanel f = new JPanel();
f.setLayout(new BoxLayout(f, BoxLayout.Y_AXIS));
f.add(d);
f.add(e);
JPanel b1 = new JPanel();
b1.add(f);

setContentPane(b1);
// cr?ation de tous les composants graphiques de la fentre
}
public void initattribut(){
TesBoutons = new JButton[8][8];
for (int i=0; i<8; i++) {
for (int j = 0; j < 8; j++) {
TesBoutons[i][j] = new JButton("");
TesBoutons[i][j].setActionCommand("" + i + "" + j);
TesBoutons[i][j].setPreferredSize(new Dimension(80, 80));
TesBoutons[i][j].setIcon(m.getListeImages()[m.getTesbouton(i,j)]);
TesBoutons[i][j].setDisabledIcon(m.getListeImages()[m.getTesbouton(i,j)]);
}//fin du for des j
}//fin du for des i
level = new JLabel("Level :");
trie = new JLabel("Tries :");
score = new JLabel("Score :");

}



}



Model
   
public class Model {
public int[] bestScores;
public File scoresPath;
public ImageIcon[] listimage;
Vue v;







public Model(Vue v){
this.v=v;
charger();
Lire();
ecrire();
}



//Les Méthodes
protected void charger(){
File folder = new File("IHM2/src");
listimage = new ImageIcon[8];
int cpt = 0;



for(final File fileEntry : folder.listFiles()){

if(fileEntry.getName().charAt(0) == '.')
continue;
listimage[cpt] = new ImageIcon("IHM2/src"+'/' + fileEntry.getName());
cpt++;
}



}
public void Lire(){
int cpt = 0;String s;
try {


BufferedReader br = new BufferedReader(new FileReader(scoresPath));
while ((s = br.readLine()) != null) {
bestScores[cpt] = Integer.parseInt(s);
cpt++;
}
br.close();
}catch(Exception e){
e.printStackTrace();
}
}
public void ecrire(){
try{
BufferedWriter bw = new BufferedWriter(new FileWriter(scoresPath));
bw.write(""+ bestScores[0]);
bw.newLine();
bw.write("" + bestScores[1]);
bw.newLine();
bw.close();
}catch(Exception e){
e.printStackTrace();
}



}


//Les Getters
public ImageIcon[] getListeImages() {
charger();
return listimage;
}
public JButton getTesbouton(int i,int j) {
return v.TesBoutons[i][j];
}





public void setTesBoutons(JButton[][] tesBoutons) {
v.TesBoutons = tesBoutons;
}


}


Avec la classe Appli pour visualiser la fenètre:


class Appli {

public static void main(String[] args) {

javax.swing.SwingUtilities.invokeLater( new Runnable() {

public void run() {

Vue v = new Vue();
Model m = new Model(v);


}

});
}
}





J'ai bien pris en compte ta remarque pour protéger la class charger().

Voila j'espère avoir été assez précis cette fois et j'attend ta réponse avec impatience.
Encore merci.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
27 avril 2015 à 20:45
Re,

Dsl, comme tu as initialement parlé d'un nullpointer je n'ai pas fait attention au type de retour de la méthode 'getTesbouton'

"
Il me dit que [m.getTesbouton(i,j)] doit retourné un entier et c'est cela que je ne comprend pas.
"
Ta méthode getListeImages retourne un tableau d'objets de type ImageIcon et au moment ou tu fais 'getListeImages()[indice_du_tableau]' le 'indice_du_tableau' ne peut être autre chose qu'un entier compris entre 0 et le nombre max d'éléments dans ton tableau et non pas un JButton


Pour le nullpointer, dans ta classe Vue à aucun moment la variable 'm' n'est initialisée ... donc à l'exécution *boum*

Pour le reste ... chaque choses en son temps ...



0
Re,
Merci pour tes conseils
J'ai réussit a réparé mes erreurs .
Sur ce bonne semaine et encore merci.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
29 avril 2015 à 08:12
Salut,

De rien.

Je me permet juste une autre intervention sur ta classe Model:
1 - La variable scorePath est toujours null.
2 - La variable bestScores est toujours null.
3 - Le content des méthodes Lire et ecrire sont vraiment old school.
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class Test {

  private List<Integer> bestScores = new ArrayList<Integer>();
  private File          scoresPath;

  public void lire() {
    try {
      final Scanner sc = new Scanner(scoresPath);
      while (sc.hasNextInt()) bestScores.add(sc.nextInt());
      sc.close();
    } catch(FileNotFoundException fnfe) {
      fnfe.printStackTrace();
    }
  }

  public void ecrire() {
    try {
      final PrintWriter pw = new PrintWriter(scoresPath);
      for (final int i : bestScores) pw.println(i);
      pw.close();
    } catch(FileNotFoundException fnfe) {
      fnfe.printStackTrace();
    }
  }
  
  public void addScore(int score) {
    bestScores.add(score);
  }
  
  public void printScore(final PrintStream pw) {
    for (final int i : bestScores) pw.println(i);
  }
  
  
  public static void main(String[] args) {
    Test t = new Test();
    t.scoresPath = new File("score.txt");
    t.lire();
    
    /* ajout de quelques scores */
    Random rand = new Random();
    for(int i = 0; i < 10; i++) t.addScore(rand.nextInt());
    t.ecrire();
    
    t.printScore(System.out);
  }
}


0
Salut je viens seulement de voir ton message désolé,
Merci pour tes conseilles .
Cependant après avoir progressé dans mon projet depuis l'autre jour je suis de nouveau confronter à plusieurs problème et surtout celui qui est de ne pas afficher 3 grappe au début de la partie car je n'arrive pas a associer les coordonnées du bouton avec son image., j'ai beaucoup chercher mais je ne trouve pas
Voici pour l'instant mon code donc je suis partie sur 2 possibilité que je n'arrive pas a transformer en language java :
public void paplusde2(JButton TesBouton[][],int a) {


        for (int i = 0;i<8; i++){
            for(int j = 0;j<8;j++){

                while (// Image Bouton[i][j]=Image Bouton[i][j+1]=Image Bouton[i][j+2] ou que Image Bouton[i][j]=Image Bouton[i+1][j]=Image Bouton[i+2][j] )


                    if (TesBouton[i][j].listimage[a] == TesBouton[i][j + 1].getListeImages()[a] && TesBouton[i][j + 1].getListeImages()[a] = TesBouton[i][j + 2].getListeImages()[a] ) {
                        TesBouton[i][j].setIcon(getListeImages()[getTesbouton(0, 7)]);
                        TesBouton[i][j].setDisabledIcon(getListeImages()[getTesbouton(0, 7)]);
                    }
                    if (TesBouton[i][j].getListeImages()[a] = TesBouton[i + 1][j].getListeImages()[a] && TesBouton[i + 1][j].getListeImages()[a] = TesBouton[i + 2][j].getListeImages()[a]){
                        TesBouton[i][j].setIcon(getListeImages()[getTesbouton(0, 7)]);
                        TesBouton[i][j].setDisabledIcon(getListeImages()[getTesbouton(0, 7)]);
                    }


            }


        }


Ou celui la
public void paplusde2(JButton TesBouton[][],int a) {


        for (int i = 0;i<8; i++){
            for(int j = 0;j<8;j++){

                while (// Image Bouton[i][j]=Image Bouton[i][j+1]=Image Bouton[i][j+2] ou que Image Bouton[i][j]=Image Bouton[i+1][j]=Image Bouton[i+2][j] )


                    if (TesBouton[i][j].listimage[a] == TesBouton[i][j + 1].getListeImages()[a] && TesBouton[i][j + 1].getListeImages()[a] = TesBouton[i][j + 2].getListeImages()[a] ) {
                        //Fonction qui supprime la grappe + fonction qui fait descendre les images
                    }
                    if (TesBouton[i][j].getListeImages()[a] = TesBouton[i + 1][j].getListeImages()[a] && TesBouton[i + 1][j].getListeImages()[a] = TesBouton[i + 2][j].getListeImages()[a]){
                        //Fonction qui supprime la grappe + fonction qui fait descendre les images
                    }


            }


        }

A noté que je suis bloqué aussi pour ce qui est de mettre en java les 2 fonction qui supprime les grappe est celle qui fait descendre les images car je n'arrive pas a associer les coordonnées du bouton avec son image.

Je te remercie d'avance est j'espère que tu sauras résoudre mon probleme
0
Rejoignez-nous