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

 Java Discussion :

Afficher rond dans un JPanel


Sujet :

Java

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 1
    Par défaut Afficher rond dans un JPanel
    Bonjour,

    Commençant tout juste en programmation, j'ai créé un plateau de jeu avec JFrame et JPanel.

    Je souhaite à présent afficher un rond dans une case de mon plateau (pour représenter un pion), mais bien sûr le rond ne s'affiche pas.



    Voici ma classe représentant le Plateau voir => TEST AJOUT PION
    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
     
     
     
    // pan10 : case 21
    	    gbc.gridx = 0;
    	    gbc.gridy = 1;
    	    gbc.gridwidth = 1;
    	    gbc.gridheight = 1;
    	    gbc.fill = GridBagConstraints.VERTICAL;
     
     
    	    JLabel case21 = new JLabel ("21");
    		JPanel pan10 = new JPanel();
    		pan10.setBorder(BorderFactory.createMatteBorder(0,2,2,2, Color.BLACK));
    		pan10.setPreferredSize(caseB);
     
     
    		// TEST AJOUT PION 
     
    		pan10.setLayout(new BorderLayout());					
    		pan10.add(new Pion(), BorderLayout.WEST);	
     
     
    		pan10.add(case21, BorderLayout.NORTH);
    		pan1.add(pan10, gbc);

    Ma classe représentant mon objet Pion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Pion extends JPanel {
     
     
    	public void paintComponent(Graphics g){
    	    System.out.println("Affichage du pion"); 
    	    g.fillOval(50, 80, 10, 10);
    	  }


    Merci de votre aide !

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 262
    Par défaut
    Salut,

    Il faut juste appeler la méthode de la super classe d'abord avant de faire quoi
    que ce soit paintComponent , comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Pion extends JPanel {
    public void paintComponent(Graphics g){
    super.paintComponent(g);
    System.out.println("Affichage du pion"); 
    g.fillOval(50, 80, 10, 10);
    }

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Non, @lankoande, le problème n'est pas là. Mais ici : g.fillOval(50, 80, 10, 10);Les coordonnées des pixels dans un composant ont pour origine le point en haut à gauche, qui est 0,0. Ici, le pion est mis à l'ouest (WEST) d'un BorderLayout, ce qui impose une taille au composant selon des règles un peu complexe à expliquer ici (d'après taille du container, taille préférentielle du JPanel, etc) : peu importe, les coordonnées 50,80 sont probablement hors affichage et on ne voit pas le cercle.

    @ebios, arrange-toi pour toujours dessiner dans les bounds actuelles du composant (0,0,getWidth(),getHeight()).

    Ici un exemple :
    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
    public class Pion extends JPanel {
     
    	public Pion(Color color) {
    		setOpaque(false);
    		setForeground(color);
    	}
     
    	@Override
    	protected void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		g.setColor(getForeground());
                    // le cercle s'étend sur toute la surface : si tu commentes la ligne suivante et décommente celle juste après, le cercle sera plus petit que la surface disponible
    		g.fillOval(0, 0, getWidth(), getHeight());
    		//g.fillOval(getWidth()/10, getHeight()/10, getWidth()-getWidth()/5, getHeight()-getHeight()/5);
    	}
     
     
    	public static void main(String[] args) {
     
    		int nb=10;
     
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		frame.getContentPane().setLayout(new OverlayLayout(frame.getContentPane()));
     
    		// le dammier
    		JPanel dammier = new JPanel(new GridLayout(0,nb));
    		for(int i=0; i<nb; i++) {
    			for(int j=0; j<nb; j++) {
    				JPanel caseDammier = new JPanel();
    				if ( i%2==j%2 ) { // cases en quinconce
    					caseDammier.setBackground(Color.WHITE);
    				}
    				else {
    					caseDammier.setBackground(Color.BLACK);
    				}
    				dammier.add(caseDammier);
    			}
    		}
     
    		JPanel panel = new JPanel(new GridLayout(0,nb));
    		panel.setOpaque(false);;
     
    		for(int i=0; i<nb; i++) {
    			for(int j=0; j<nb; j++) {
    				if ( i%2==j%2 ) { // pions en quinconce
    					panel.add(new Pion(Color.RED));
    				}
    				else {
    					panel.add(new Pion(Color.BLUE));
    				}
    			}
    		}
     
    		// on ajoute les panels dans le sens inverse (ceux du dessus en premier)
    		frame.add(panel);
    		frame.add(dammier);
     
    		frame.setSize(600, 600);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    }
    Rendu 1 :
    Nom : rendu1.png
Affichages : 360
Taille : 28,2 Ko

    Rendu 2 (si tu inverses les commentaires dans paintComponent comme indiqué) :
    Nom : rendu2.png
Affichages : 345
Taille : 34,2 Ko


    PS pour en revenir à ce qu'a écrit @lankoande; il s'agit de la transparence. On peut gérer la transparence en n'appelant pas super, mais il est mieux de le faire en utilisant l'attribut opaque comme je l'ai fait (ce qui nécessite d'avoir cette ligne que @lankoande a ajoutée). L'avantage c'est que le composant peut fonctioner dans les 2 modes, alors que si on supprime la ligne, il sera toujours transparent, mais en plus on risque d'avoir des scories affichées dans le fond.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 262
    Par défaut
    Salut, joel j'approuve !
    C'est vachement vrai !
    Merçi encore pour la réponse !

    J'apprend à pêcher du poisson !

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/07/2012, 19h05
  2. Tous les composants ne s'affichent pas dans un JPanel
    Par julie4207 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 26/06/2008, 11h24
  3. Comment afficher du texte dans un JPanel (ex:chat)
    Par remooz dans le forum AWT/Swing
    Réponses: 24
    Dernier message: 05/06/2006, 12h06
  4. comment afficher une image dans un jpanel ?
    Par 180degrés dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 18/04/2006, 15h33
  5. Afficher simple texte dans un JPanel
    Par tit_oune dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 12/04/2006, 12h20

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