IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

Affichage page vierge sans raison


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut Affichage page vierge sans raison
    Bonjour à tous,

    J'ai un problème depuis plusieurs jours que je n'arrive pas à résoudre. Je tiens à préciser que je poste mon sujet dans cette catégorie car c'est en rapport avec la conséquence mon problème, mais que le problème vient peut-être d'ailleurs.

    Je vais essayer d'être clair: Je dois programmer un jeu du "Picross" pour un projet personnel (si vous ne connaissez pas, le but est de cliquer sur des cases en s'aidant d'indice dans le but de découvrir un dessin à la fin). Pour cela je créé un tableau pré-remplis de "0" (case blanche) ou de "1" (case noir), mais lorsque ce tableau est présent, la fenêtre d'affichage de mon jeu renvoie une page blanche.

    Voici le code de la classe Partie gérant, donc, la partie:
    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
    public class Partie {
     
        //Initialisation des variables de classes
        int nbCaseParLigne;
     
        //Tableau posant problème: si je le met en commentaire, l'affichage est normal, sinon j'obtient une page blanche.
        int tabSolution[][]={{0,1,1,1,0},{1,1,1,1,1},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,1,0}};
        int tabReponse[][];
     
     
        public Partie(int nbCaseParLigne){
     
     
            int numLigne, numColonne, erreur=0;
            this.nbCaseParLigne = nbCaseParLigne;
     
            tabReponse = new int[nbCaseParLigne][nbCaseParLigne];
     
     
            Fenetre jeu = new Fenetre(nbCaseParLigne);
     
            while(!(partieTerminee())){
     
                numLigne = jeu.ligneCase;
                numColonne = jeu.colonneCase;
     
                if ((tabSolution[numLigne][numColonne])==1){
                    jeu.caseNoire(numLigne, numColonne);
                    tabReponse[numLigne][numColonne]=1;
                } else {
                    jeu.croixRouge(numLigne, numColonne);
                    erreur +=1;
                    tabReponse[numLigne][numColonne]=(-1);
                }
            }
     
        }
    Et voici le code de la classe Fenetre gérant l'affichage:
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    public class Fenetre extends JFrame {
     
        JLabel[][] tableauJlabel;
        JPanel panelJeu = new JPanel();
     
        ImageIcon blanc;
        ImageIcon noir;
        ImageIcon croixRouge;
     
        int nbCase;
     
         int ligneCase;
         int colonneCase;
     
        public Fenetre(int a) {
     
     
            super("Picross");
            this.setSize(800, 800);
            this.setResizable(false);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setVisible(true);
     
     
            nbCase = a;
     
            //assignation d'un Layout à nos panels
            panelJeu.setLayout(null);
     
     
            //création tableau JLabel
            tableauJlabel = new JLabel[nbCase][nbCase];
     
            //choix des images pour les JLabels
            if(nbCase == 5){
                blanc = new ImageIcon("blanc5.jpg");
            }
            if(nbCase == 10){
                blanc = new ImageIcon("blanc10.jpg");
            }
            if(nbCase == 20){
                blanc = new ImageIcon("blanc20.jpg");
            }
     
     
              if(nbCase == 5){
                noir = new ImageIcon("noir5.jpg");
            }
            if(nbCase == 10){
                noir = new ImageIcon("noir10.jpg");
            }
            if(nbCase == 20){
                noir = new ImageIcon("noir20.jpg");
            }
     
     
            if(nbCase == 5){
                croixRouge = new ImageIcon("croix5.jpg");
            }
            if(nbCase == 10){
                croixRouge = new ImageIcon("croix10.jpg");
            }
            if(nbCase == 20){
                croixRouge = new ImageIcon("croix20.jpg");
            }
     
     
     
            //dimensionnement de nos JLabel pour une grille de 5
            if (nbCase == 5) {
                for (int i = 0; i < nbCase; i++) {
                    for (int j = 0; j < nbCase; j++) {
                        tableauJlabel[i][j] = new JLabel();
                        tableauJlabel[i][j].setBounds(150 + (100 * i), 150 + (100 * j), 100, 100);
                        tableauJlabel[i][j].setIcon(blanc);
                        panelJeu.add(tableauJlabel[i][j]);
                        this.setContentPane(panelJeu);
                    }
                }
            }
     
              /*    //ajout des écouteurs sur la grille
                for (int i = 0; i < nbCase; i++) {
                    for (int j = 0; j < nbCase; j++) {
                        //la ligne problématique depuis hier
                        //tableauJlabel[i][j].addMouseListener(this);
                    }
                }
     
     
            }*/
     
            //dimensionnement de nos JLabel pour une grille de 10
            if (nbCase == 10) {
                for (int i = 0; i < nbCase; i++) {
                    for (int j = 0; j < nbCase; j++) {
                        tableauJlabel[i][j] = new JLabel();
                        tableauJlabel[i][j].setBounds(150 + (50 * i), 150 + (50 * j), 50, 50);
                        tableauJlabel[i][j].setIcon(blanc);
                        tableauJlabel[i][j].setText("B");
                        panelJeu.add(tableauJlabel[i][j]);
                        this.setContentPane(panelJeu);
                    }
                }
            }
     
     
            //dimensionnement de nos JLabel pour une grille de 10
            if (nbCase == 20) {
                for (int i = 0; i < nbCase; i++) {
                    for (int j = 0; j < nbCase; j++) {
                        tableauJlabel[i][j] = new JLabel();
                        tableauJlabel[i][j].setBounds(150 + (25 * i), 150 + (25 * j), 25, 25);
                        tableauJlabel[i][j].setIcon(blanc);
                        tableauJlabel[i][j].setText("B");
                        panelJeu.add(tableauJlabel[i][j]);
                        this.setContentPane(panelJeu);
                    }
                }
            }
     
     
     
            this.setContentPane(panelJeu);
        }
    Les autres classes ne me semblent pas importantes pour ce problème, si vous pensez que le problème vient de celles-ci, je vous les fournirai.

    Je ne trouve aucune solution rationnelle à ce problème, je remercie donc tous ceux qui m'aideront à ce sujet.

    Je restes bien sûr à votre disposition en cas de problème,

    Merci d'avance,

    Toine52000

  2. #2
    Modérateur
    Avatar de XxArchangexX
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2012
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 159
    Par défaut
    Bonjour,

    Il faudrait tester pour te dire en détail donc je vais te donner mon impression ne pouvant pas tester actuellement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       for (int j = 0; j < nbCase; j++) {
                        tableauJlabel[i][j] = new JLabel();
                        tableauJlabel[i][j].setBounds(150 + (100 * i), 150 + (100 * j), 100, 100);
                        tableauJlabel[i][j].setIcon(blanc);
                        panelJeu.add(tableauJlabel[i][j]);
                        this.setContentPane(panelJeu);
                    }
    setContentPane => tu dis à ta Jframe que ton panelJeu devient le panel par défaut il n'a pas de layout.

    Dessus tu rajoutes des JLabel qui sont blanc que tu places avec ton équation de setBounds.

    Si le JPanel contient bien les JLabel blanc disposé avec ton équation sa me surprendrai pas de voir une page toute blanche ou alors j'ai raté un truc.
    L'Etat est bien administré quand l'escalier de l'école est usé et que l'herbe croît sur celui du tribunal.

    Modérateur BI

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    Tout d'abord merci de vouloir m'aider.

    En faites, on ajoute des ImageIcon sur nos JLabel, mes images ne sont pas vraiment blanches (c'est leurs noms mais elles ont en faites un effet d'ombre) donc elles devraient clairement ressortir sur le fond. De plus elles ne prennent pas toute la fenêtre, mais sont concentrées au milieu.

    Comme je l'avais dis le programme marche bien sans le tableau, mais avec ce dernier l'affichage est blanc...

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    commence déjà par afficher ta console java et nous dire ce qu'il y a. En général quand t'as un fenetre vide, c'est qu'une exception a été levée au moment de la remplir. Il serait donc utile de la connaitre

  5. #5
    Membre émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Par défaut
    En voyant ça:
    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
     
    while(!(partieTerminee())){
     
                numLigne = jeu.ligneCase;
                numColonne = jeu.colonneCase;
     
                if ((tabSolution[numLigne][numColonne])==1){
                    jeu.caseNoire(numLigne, numColonne);
                    tabReponse[numLigne][numColonne]=1;
                } else {
                    jeu.croixRouge(numLigne, numColonne);
                    erreur +=1;
                    tabReponse[numLigne][numColonne]=(-1);
                }
            }
    je me dis que ça me rappelle des souvenirs
    http://www.developpez.net/forums/d21...ue-boucle-for/

    Tu effectue un traitement de longue durée, appelé directement depuis le main de ton programme. Pendant la durée de ce traitement, c'est à dire, si j'ai compris ton programme, toute la durée de la partie, le rafraîchissement ne se fera pas.
    => Les traitements longs doivent s'exécuter dans un nouveau Thread:
    http://gfx.developpez.com/tutoriel/j...ing-threading/

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    commence déjà par afficher ta console java et nous dire ce qu'il y a. En général quand t'as un fenetre vide, c'est qu'une exception a été levée au moment de la remplir. Il serait donc utile de la connaitre
    Aucune exception n'a été levé, en faites le programme est toujours en "run" et ne s'arrête jamais, la fenêtre restant toujours blanche et ma console toujours vide...

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    Citation Envoyé par Jidefix Voir le message
    je me dis que ça me rappelle des souvenirs
    http://www.developpez.net/forums/d21...ue-boucle-for/

    Tu effectue un traitement de longue durée, appelé directement depuis le main de ton programme. Pendant la durée de ce traitement, c'est à dire, si j'ai compris ton programme, toute la durée de la partie, le rafraîchissement ne se fera pas.
    => Les traitements longs doivent s'exécuter dans un nouveau Thread:
    http://gfx.developpez.com/tutoriel/j...ing-threading/
    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
    Fenetre jeu = new Fenetre(nbCaseParLigne);
     
            while(!(partieTerminee())){
     
                numLigne = jeu.ligneCase;
                numColonne = jeu.colonneCase;
     
                if ((tabSolution[numLigne][numColonne])==1){
                    jeu.caseNoire(numLigne, numColonne);
                    tabReponse[numLigne][numColonne]=1;
                } else {
                    jeu.croixRouge(numLigne, numColonne);
                    erreur +=1;
                    tabReponse[numLigne][numColonne]=(-1);
                }
            }
    Peut-être que je me trompe, mais comme tu le vois j'instancie un nouvel objet Fenetre avant d'entrer dans cette bouche, alors pourquoi cette dernière "freezerais" mon affichage? A la rigueur ne l'actualiserais pas je veux bien, mais ne peux l'afficher au départ je ne comprend pas.

  8. #8
    Modérateur
    Avatar de XxArchangexX
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2012
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 159
    Par défaut
    Tu es en boucle infinie avec ton While, la fenêtre se lance mais passe directement à ton traitement while en boucle infinie puisque ta partie ne se termine pas. D'où la remarque de Jidefix, avec la mise en place d'un Thread.

    Juste pour être sûr :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while(!(partieTerminee())){
      System.out.println("Test");
    ou juste après ta fenêtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    try{
    Thread.sleep(10000);
    catch(InterruptedException e){}
    L'Etat est bien administré quand l'escalier de l'école est usé et que l'herbe croît sur celui du tribunal.

    Modérateur BI

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    Ah d'accord je comprend, je dois en faites attendre un clic de souris avant de rentrer dans la condition.

    Du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    attendreClicSouris();
          if(!(partieTerminee())){
                     ...}
    Mais comment puis-je créer une boucle qui s’exécutera à chaque clic de souris?

  10. #10
    Modérateur
    Avatar de XxArchangexX
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2012
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 159
    Par défaut
    Tu as plusieurs solution, mais sur ta vue , d'intuition sur PanelJeu il te faut un Listener ( MouseListener pour le clique de la souris), ainsi sur la fenêtre de jeu quand l'utilisateur clic sur le panel sa lance ce qu'il y a dans la fonction du listener.

    De la soit tu fais ta boucle mais ton jeu sera freeze le temps du traitement, soit tu fais un Thread ainsi le temps que le traitement se fasse tu n'auras pas l'impression de freeze sur la fenêtre.

    Donc quand tu lances une partie tu aurais juste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fenetre jeu = new Fenetre(nbCaseParLigne);
    après c'est dans d'autre classe la gestion du traitement.

    Je ne connais pas ton jeu mais avec une grille de Label blanc, je dirais comme sa que l'utilisateur doit cliquer sur les cases, donc ce qu'il faudrait c'est un Listener sur chaque Label ainsi selon le label cliqué tu aurais le lancement de ton traitement.
    L'Etat est bien administré quand l'escalier de l'école est usé et que l'herbe croît sur celui du tribunal.

    Modérateur BI

  11. #11
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par toine52000 Voir le message
    Ah d'accord je comprend, je dois en faites attendre un clic de souris avant de rentrer dans la condition.
    Non, ce que tu dois faire c'est comprendre qu'il n'y a qu'un seul thread, l'EDT, qui est chargé de la gestion de l'affichage. Et tant que ce thread sera occupé dans ta boucle infinie, il ne pourra rien faire d'autre. Les calculs longs ne doivent jamais se faire dans l'EDT
    http://rom.developpez.com/java-swingworker/

  12. #12
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    Oui j'avais ajouter des MouseListener mais je les avais enlever en postant sur le forum pour être plus clair, je vais essayer de faire sa au mieux, merci beaucoup.

    J'ai lu les explications et j'ai compris le problème. Toutefois il me reste un dernier point assez sombre: Comment puis-je appeler les fonctions portant sur l'objet "jeu" comme jeu.ligneCase() par exemple, sachant que maintenant je crée cet objet par l'intermédiaire d'une autre classe?

    En tout cas merci beaucoup à vous deux.

  13. #13
    Modérateur
    Avatar de XxArchangexX
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2012
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 159
    Par défaut
    C'est à dire? un peu fatigué peut être mais je te dirais que dans la classe ou tu créés l'objet après il faut que tu fasses circuler l'objet jeu.

    si dans une classe de base tu as mettre en place.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Fenetre jeu = new Fenetre(nbCaseParLigne);
    Partie unePartie = new Partie(jeu,nbCaseParLigne);
    ainsi dans la classe Partie avec l'objet jeu tu peux appeller les méthodes de jeu.

    Sa répond à ta question?
    L'Etat est bien administré quand l'escalier de l'école est usé et que l'herbe croît sur celui du tribunal.

    Modérateur BI

  14. #14
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    C'est effectivement ce que j'ai fait, mais du coup l'affichage freeze parce que l'objet jeu est présent dans la classe Partie

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/05/2014, 13h39
  2. Réponses: 1
    Dernier message: 12/06/2006, 13h34
  3. Page s'exécutant sans raison apparente
    Par j_bolduc dans le forum ASP
    Réponses: 4
    Dernier message: 23/02/2006, 15h33
  4. ma base gonfle sans raison !!!
    Par hiul dragonfel dans le forum Access
    Réponses: 6
    Dernier message: 20/06/2005, 10h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo