Problème JPanel this.getWitdth

alexp23 Messages postés 88 Date d'inscription   Statut Membre Dernière intervention   -  
alexp23 Messages postés 88 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
J'ai une question sur le JPanel :
J'ai une classe extends JPanel et la valeur de this.getWidth est de 0 hors de la méthode

paintComponent(Graphics g){}

mais dans celle ci, aucun problème.

Sur internet, j'ai vu des réponses (toutes en anglais) mais avec une traduction aproximative j'ai pas compris comment faire. Quelqu'un aurais une technique pour avoir la valeur de this.getWidth() hors de la méthode paint ?

Merci d'avance

2 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Il faudrait voir ton code. Peut être que this n'est pas le même à l'endroit où tu veux faire un getWidth. Ou alors la méthode est appelée avant que tu n'ai défini la taille de la fenêtre contrairement au paint qui ne s'exécute qu'une fois la fenêtre affichée...
0
alexp23 Messages postés 88 Date d'inscription   Statut Membre Dernière intervention   4
 
merci de m'avoir répondu, voici mon code
classe Fenetre:

package balle_3;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Fenetre extends JFrame{
Balle Ba = new Balle();


public Fenetre(){

this.setContentPane(Ba);
this.setTitle("Balle");
this.setSize(500, 500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
Balle b2 = new Balle(30, 80, 20, 20);

}


}
classe Balle :
package balle_3;


import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class Balle extends JPanel{


private static int B1x = 20;
private static int B1y = 20;

private static int B2x = 50;
private static int B2y = 30;

boolean retourX1 = false;
boolean retourY1 = false;



public void paintComponent(Graphics g){


g.setColor(Color.white);
g.fillRect(0, 0, this.getWidth(), this.getHeight());

g.setColor(Color.red);
g.fillOval(B1x, B1y, 30, 30);

g.setColor(Color.orange);
g.fillOval(B2x, B2y, 30, 30);

repaint();

}
public Balle(){

}

public Balle(int PB1x, int PB1y, int PB2x, int PB2y){


this.B1x = PB1x; this.B1y = PB1y;
this.B2x = PB2x; this.B2y = PB2y;

do{


if(B1x < 1){ retourX1 = false; }
if(B1y < 1){ retourY1 = false; }


B1x ++;
B2x ++;

repaint();
try {
Thread.sleep(10);
} catch (InterruptedException e) {e.printStackTrace();}

}while(true);

}





}
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Ne mets pas de repaint à l'intérieur de paintComponent, ça va provoquer une récursivité infinie et planter le programme. (PS. paint est plus judicieux que paintComponent...)

Ce qu'il te faut c'est une boucle, comme tu l'as faite avec ton do while, sauf que tu l'as mis dans le constructeur ! Du coup ton programme reste coincé dans le constructeur...

De plus, n'utilises pas de variables static pour B1x, etc.

package balle_3;

import javax.swing.JFrame;

public class Fenetre extends JFrame
{
    private static final long serialVersionUID = 1;
    
    private Balle Ba = new Balle();
    
    public Fenetre()
    {
        this.setContentPane(Ba);
        this.setTitle("Balle");
        this.setSize(500, 500);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        
        Ba.start();
    }
    
    public static void main(String[] args)
    {
        new Fenetre();
    }
}

package balle_3;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class Balle extends JPanel
{
    private static final long serialVersionUID = 1;
    
    private int B1x;
    private int B1y;
    
    private int B2x;
    private int B2y;
    
    boolean retourX1 = false;
    boolean retourY1 = false;
    
    @Override
    public void paint(Graphics g)
    {
        g.setColor(Color.white);
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
        
        g.setColor(Color.red);
        g.fillOval(B1x, B1y, 30, 30);
        
        g.setColor(Color.orange);
        g.fillOval(B2x, B2y, 30, 30);
    }
    
    public Balle()
    {
        this(20,20,50,30); 
    }
    
    public Balle(int PB1x, int PB1y, int PB2x, int PB2y)
    {
        this.B1x = PB1x;
        this.B1y = PB1y;
        this.B2x = PB2x;
        this.B2y = PB2y;        
    }

    public void start()
    {
        while (true)
        {
            if (B1x < 1)
            {
                retourX1 = false;
            }
            if (B1y < 1)
            {
                retourY1 = false;
            }
            
            B1x++ ;
            B2x++ ;
            
            repaint();
                        
            try
            {
                Thread.sleep(10);
            }
            catch (InterruptedException e)
            {
                break;
            }
        }
    }   
}

Remarque : sauf erreur de ma part, ton programme ne fait rien de plus pour l'instant, mais comme il le fait mieux, tu arriveras peut-être à faire ce que tu veux (tu nous as pas dit quoi...)
0
alexp23 Messages postés 88 Date d'inscription   Statut Membre Dernière intervention   4
 
Merci pour tout ces conseils !
Je voulais faire this.getHeight() mais la valeur étais de 0 en System.out.print, mais avec le code que tu m'as fais, le problème est résolue.
Par contre e sais pas d'ou venais le problème.
Pour les variables statiques, j'avais trouver que ce moyen de les récupérer, j'avais une erreur sinon.
En tout les cas merci !
0