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

2D Java Discussion :

Affichage d'objets graphique personnalisés


Sujet :

2D Java

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 27
    Points : 13
    Points
    13
    Par défaut Affichage d'objets graphique personnalisés
    Bonsoir,

    Je suis débutant en Java,et je m'intéresse entre autre aux composants graphiques avec swing...

    je vous explique mon probleme.
    J'ai créé une fenetre avec un objet JFrame, ensuite j'ai créé un objet Panneau de JPanel et je voudrais afficher 32 carrés gris(4 X 8) dans ce panneau.

    Je ne sais pas du tout si je suis pres de la solution ou pas.

    Pouvez vous m'aider?

    Merci d'avance.

    PS: ci-dessous la classe Panneau :

    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
    public class Panneau extends JPanel{
    	Spot tab[][]= new Spot[4][8];
    	Spot[] sp = new Spot[4];	
    	public void paintComponent(Graphics g){		
    		g.setColor(Color.black);
    		g.fillRect(100, 115, 200, 350);			
    		for (int j = 0;j<8;j++)
    		{
    			for (int i=0;i<4;i++)
    			{							
    				sp[i].setPosX(120+(i*50));
    				sp[i].setPosY(135+(40*j));
    				sp[i].setCouleur(Color.gray);
     
    				this.getGraphics().setColor(Color.gray);
    				this.getGraphics().fillRect(sp[i].getPosX(),sp[i].getPosY(), 40, 40);
    				tab[j][i]=sp[i];
    				//this.repaint();
    			}			
    		}		
    	}
    }
    et ici la classe Spot ne contient que les getters et setters (posX et posY pour les coordonnées en x et y.

  2. #2
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    je suis pres de la solution

    Petit complément d'information :
    Pour afficher 32 carrés gris il faut effectivement redéfinir paintComponent.(Ou alors utiliser un GridLayout avec des JLabels ou des JButtons)
    Dans ton exemple il y a plusieurs erreurs/trucs bizarres/lacune qui sautent au yeux.
    Pourquoi utiliser 2 tableaux?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Spot tab[][]= new Spot[4][8];
    Spot[] sp = new Spot[4];
    sp est inutile selon moi.
    Tu n'initialise pas les éléments de tab[][].
    Tu définie la taille des cases = 40. Et si on redimensionne la fenêtre?
    Tu devrais prévoir cela, il n'y a quasiment rien à ajouter

    Au final, pourquoi ne pas faire un simple et grand carré gris
    Quelle est la finalité? pouvoir cliquer dessus par la suite?
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Merci Ivelios pour la réponse rapide.

    En fait, la finalité est de pouvoir changer la couleur de ces carrés gris en fonction d'un timer(je n'ai pas encore fait cette partie, chaque chose en son temps ).

    Pour le tableau sp, vous avez raison, après avoir relu la théorie,en effet, 1 tableau a 2 dimensions suffit.

    Avec quelles données initialiser le tableau tab[][]?

    et si je remplace dans cette ligne =>this.getGraphics().fillRect(sp[i].getPosX(),sp[i].getPosY(), 40, 40);

    les sp[i] par tab [i][j], ca ne va pas beaucoup mieux.

    Et la taille des carrés (40) peut effectivement etre déclarée avec une variable dépendante de la taille de la fenetre

    Merci d'avance pour les eclaircissements

  4. #4
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Si le but final est de modifie les couleurs toutes les secondes par exemple alors :
    sp doit être un tableau de couleurs
    Et tous les "clock" d'horloge il faudra modifier le tableau et repaint();
    Un peu comme ç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
    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
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    /**
     *
     * @author Ivelios
     */
    public class Panneau extends JPanel{
     
        private Color[][] couleurs;
     
        /**Constructeur*/
        public Panneau(){
            couleurs = new Color[4][8];
            initialisationCouleurs();
     
            // Changement des couleurs
            ActionListener action = new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                    initialisationCouleurs();
                    repaint();
                }
            };
     
            Timer t = new Timer(1000,action);//Toutes les secondes (1000 ms) déclenche l'action
            t.start();//Démarre le timer
        }
     
     
        public void initialisationCouleurs(){
            for(int i=0;i<4;i++){
                for(int j=0;j<8;j++){
                    //On choisit une couleur au hazard pour remplir le tableau
                    int random = (int)(Math.random()*5);
                    Color c = null;
                    switch(random){
                        case 0: c = Color.YELLOW; break;
                        case 1: c = Color.RED; break;
                        case 2: c = Color.BLACK; break;
                        case 3: c = Color.BLUE; break;
                        case 4: c = Color.GREEN; break;
                    }
                    //Initialisation du tableau de couleur
                    couleurs[i][j] = c;
                }
            }
        }
     
        public void paintComponent(Graphics g){
            //Grille des couleurs
            for (int i = 0;i<4;i++){
                for (int j=0;j<8;j++){
                     g.setColor(couleurs[i][j]);
                     g.fillRect(i*40,j*40, 40, 40);
                }
            }
     
        }
     
        public static void main(String[] arrrrrrrgs){
            JFrame fenetre = new JFrame();
            fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fenetre.setContentPane(new Panneau());
            fenetre.setSize(200, 400);
            fenetre.setVisible(true);
        }
    }
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    ce n'est pas exactement ce que je veux faire, mais les bases y sont pour pouvoir m'améliorer.

    J'ai encore une question : la méthode paintComponent est-elle appelée à l'exécution de repaint()?

    j'ai encore un peu de mal a savoir quand elle s'exécute précisément.

    Le tableau de couleurs est intéressant mais il faudrait que je le modifie car seules 2 couleurs m'interessent, par contre la position de chaque carré est importante, d'où mon tableau.
    il faut que je sache la position de chaque carré et sa couleur.

    Merci encore.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par bigram Voir le message
    J'ai encore une question : la méthode paintComponent est-elle appelée à l'exécution de repaint()?

    j'ai encore un peu de mal a savoir quand elle s'exécute précisément.
    Non, repaint() met juste un flag indiquant que ce composant a besoin d'être repeint et et retourne immédiatement.

    Le composant sera réaffiché (et donc paintComponent() appelé) au prochain (ou à l'un des prochains) cycle de réaffichage.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Merci bouye pour la réponse.

    Peux tu me dire pourquoi cette méthode ne fonctionne pas?
    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
     
        public void initCarre(){
            //System.out.println("Dans la methode initCarre");
            for(int j=0;j<8;j++)
            {
                for(int i=0;i<4;i++)
                {        
     
                    tab[i][j].setCouleur(Color.gray);
                    tab[i][j].setPosX(120+(i*50));
                    tab[i][j].setPosY(135+(j*50));                
                }            
            }    
            this.repaint();
        }
    tab est déclarée comme il le faut pourtant (voir mon 1er post).

  8. #8
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    pourquoi cette méthode ne fonctionne pas?
    Avec le message d'erreur s'aurait été mieux mais à première vu je dirais un NullPointerException.

    Faisons simple :
    Tu initialise bien ton tableau : Spot tab[][]= new Spot[4][8];
    Mais ton tableau est actuellement VIDE. Il faut donc initialiser chaque case de ton tableau. Et créer 4*8 instance de Spot que tu stockeras dans le tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tab[i][j] = new Spot();//<- Ajouté la ligne pour créer le spot
    tab[i][j].setCouleur(Color.gray);
    tab[i][j].setPosX(120+(i*50));
    tab[i][j].setPosY(135+(j*50));
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  9. #9
    Membre à l'essai
    Inscrit en
    Octobre 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Encore merci Ivelios,

    tu as tout a fait raison, l'erreur etait un NullPointerException.
    et en rajoutant la ligne que tu m'as donnée, ca fonctionne très bien.
    Je vais donc essayer de continuer seul.
    En tout cas,ce forum est super et plein de gens sympas et pro.

    A très vite...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'affichage des objets graphiques
    Par Johngtrs dans le forum Android
    Réponses: 19
    Dernier message: 31/03/2013, 18h44
  2. Réponses: 1
    Dernier message: 10/04/2009, 21h21
  3. [Conseil] Affichage maps + objets
    Par Mathieu.J dans le forum OpenGL
    Réponses: 4
    Dernier message: 04/06/2004, 14h35
  4. [QuickReport][Débutant] Affichage d'un graphique
    Par poufouille dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/03/2004, 09h03
  5. Réponses: 3
    Dernier message: 09/02/2003, 01h09

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