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 :

JPanel initialisation Graphics2d


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 5
    Par défaut JPanel initialisation Graphics2d
    Bonjour,

    Je suis bloqué depuis deux jours sur le problème suivant :

    Je souhaiterais construire un Graphics2d lors de la construction d'un objet (hérité d'un JPanel) pour ensuite l'afficher à chaque appel de la méthode paintComponent()! L'objectif est de ne pas recalculer tout ce qui se trouve dans ce Graphics2d à chaque appel de paintComponent().
    J'ai eu beau chercher mais je n'ai pas réussi à trouver comment faire...

    pour etre plus explicite je voudrais éviter ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class monPaneau extends JPanel{
       @Override
       public void paintComponent(Graphics g){
       g.drawLine(x, y, a, b);
       .... etc
       }
    }
    et le remplacer par quelque chose de ce genre:
    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
     
    public class monPaneau extends JPanel{
     
       private Graphics2d g_;
     
       public void InitialiserImage(){
          g_ = new Graphics2d; // je sais que je ne peux pas mais ce serait l'ideal
          g_.drawLine(1,2,3,4);
          etc...
       }
     
       @Override
       public void paintComponent(Graphics g){
          g.drawGraphics(g_);// pareil
          ...
       }
    }
    Merci d'avance de votre aide!

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Il n'est pas possible de contruire des Graphics (2D ou tout court).

    En effet il ne faut utiliser que ce fournis par la méthode paintComponent, et ne les utiliser que lors de l'exécution de cette méthode (une fois la méthode exécutée, il sont rendus invalides, donc inutiles et bug prones).

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 5
    Par défaut
    Merci beaucoup pour cette réponse!

    Il n'est donc pas possible de faire ça pour un objet Graphics2d. Mais ne serait il pas possible de construire de la même manière une image pour ensuite l'afficher à l'écran sans redessiner le contenu de cette image?

  4. #4
    Membre Expert 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 : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Mais ne serait il pas possible de construire de la même manière une image pour ensuite l'afficher à l'écran sans redessiner le contenu de cette image?
    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 class monPaneau extends JPanel{
     
       private Graphics2d g_;
     
       public void dessiner(Graphics g){
          g.drawLine(1,2,3,4);
          etc...
       }
     
       @Override
       public void paintComponent(Graphics g){
          dessiner(g);
          ...
       }
    }
    C'est comme ça que je ferais personnellement.
    Après tu peux optimiser l'affichage en utilisant repaint(Rectangle r). ça ne recalcule ( redessine) que ce qu'il y a dans le rectangle.

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    En fait non. En soit cet appel n'est pas suffisant.

    Car il faut aussi s'arranger pour que, dans la surcharge de paintComponent(), on fasse les tests qu'il faut pour ne redessiner que ce qui intersecte le clip du Graphics fourni en paramètre à la méthode.
    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

  6. #6
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 5
    Par défaut
    J'ai trouvé une solution pour éviter de redessiner l'ensemble de mon panel à chaque fois :

    J'ai créé une Buffered image que je redessine à chaque appel et que j'affiche à chaque paintComponent!

    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
     
    public class MyClass extends JPanel{
       //....
       private BufferedImage image_;
     
       public void redraw(){
          Graphics g = getGraphics();
          Graphics localg;
          image_ = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
          localg = image_.createGraphics();
     
          localg.drawLine(0,0,10,10);
          //...etc le reste du dessin à redessiner
       }
     
       protected void paintComponent(Graphics g){
          g.drawImage(image_, 0, 0, this);
       }
       //.....
    }
    Merci à tous!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/11/2009, 00h09
  2. Réponses: 11
    Dernier message: 08/08/2006, 23h11
  3. JPanel et Border
    Par titoine dans le forum Débuter
    Réponses: 3
    Dernier message: 22/04/2003, 15h58
  4. Initialisation de XMLModule
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 10
    Dernier message: 01/04/2003, 10h08
  5. initialisation Directinput avec delphi
    Par Madmaxx dans le forum DirectX
    Réponses: 1
    Dernier message: 21/02/2003, 17h37

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