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 :

[Graphics2D] Mon panel fait ramer mon appli


Sujet :

2D Java

  1. #1
    Nouveau membre du Club Avatar de legzo
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 39
    Points
    39
    Par défaut [Graphics2D] Mon panel fait ramer mon appli
    Bonjour à tous, c'est encore moi.

    Alors voilà mon problème du jour: on va présenter la chose comme ça:

    - je récupère des données sous forme d'ArrayLists
    - à partir de ces données, j'élabore un objet de type Graphics2D (passage pas une petite moulinette qui me trace un graphe)
    - ensuite je crée un objet MonPanel qui étend JPanel, dont la méthode paintComponent est réécrite. Elle est reécrite comme ça d'ailleurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    protected void paintComponent(Graphics g) {
        	super.paintComponent(g);
            Graphics2D g2 = (Graphics2D)g;
            g2.drawImage(this.createImage(), 0, 0, this);
            }
    Mon problème est que mon appli rame à mort une fois le panel à l'écran. Alors j'ai fait en sorte que mon graphe se redimensionne à chaque redimensionnement de fenètre, mais même quand je bouge simplement la fenêtre, ça met mon pc à genoux.

    D'autre part, quand un autre onglet de mon appli est selectionné (mon graphe est dans un onglet particulier), l'appli peut etre redimensionnée et bougée sans aucun ralentissement.

    Voilà je me demandais s'il y avait quelque chose que je faisais mal. Le code je l'ai récupéré d'un collègue, j'avais jamais touché aux Graphics2D, alors j'ai lu le tutorial du site de Sun sans trouver de réponse à mon problème.

    Merci d'avance!

    (je précise quand même que dans mon Panel, il y a un fond blanc (un rectangle filled quoi), quelques fleches, un peu de texte, et puis c'est tout. Le Panel fait environ 800*600px.

  2. #2
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Points : 145
    Points
    145
    Par défaut
    ben oui mais il est repeint a en permanence, tantdisque si tu es sur un notre onglet il ne l'est pas.
    il faudrait qu'il soit repeint uniquement une fois le deplacement fini (genre apres un mousereleased event).
    HS : D'ailleurs il est possible de définir cette option pour des fenetres windows et ca evite bien des ramages aussi.

    tout ce que tu as a faire c'est interdire le repaint automatique du redimentionnement , ou de faire un repaint bidon dans ce cas.
    (avec un if dans paintComponent par exemple)

    reste a voir si c'est possible, cherche dans cette direction c'est mon conseil

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Cette fonctionalitée est disponible pour le JInternalFrame mais je pense pas pour les JFRame. Mais je confirme qu'il y a de forte chance que celavienne de la.

  4. #4
    Nouveau membre du Club Avatar de legzo
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 39
    Points
    39
    Par défaut
    J'ai vérifié combien de fois je passais dans mon paintComponent et à quels moments. Et en fait, il rePaint que lorsque un bout de mon panel est occulté (une autre fenêtre passe devant ou bien le panel sort en partie de l'écran et y revient). Par conséquent ces rePaint sont nécessaires, je ne vois pas trop comment je pourrais m'en passer.

    Si je ne vois pas trop comment je pourrais m'en passer en fait.

    Ce que j'aimerais c'est qu'il me paint ça comme un bouton ou un panel (de manière aussi légère) quand il n'a pas besoin de refaire le traitement sur les données ou de redimensionner.

    Et qu'il me fasse un full rePaint quand je reçois de nouvelles données ou quand le panel est redimensionné.

    C'est possibeul vous pensez?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Le seul moyen de ne pas refaire un calcul est de conserver le resultat.
    Etant donné que tu veux afficher un graphe, je pense que tu dois pouvoir en garder une trace sousforme d'image ou autre...

  6. #6
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Points : 145
    Points
    145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g2.drawImage(this.createImage(), 0, 0, this);
    createimage est une fonction a toi je présume. c'est ca qui doit prendre le plus de temps si elle sert a tout recalculer. tu n'a qu'a lappeler que quand il y en a vraiment besoin, et sinon tu charge une bufferedImage que tu peu mettre en parametre de ta calsse et que tu réactualise au besoin avec createImage

    edit : voila on est deux a dire la meme chose encore :p

  7. #7
    Nouveau membre du Club Avatar de legzo
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 39
    Points
    39
    Par défaut
    exact, createImage() est une méthode à moi (enfin que j'ai récupérée) qui me donne une BufferedImage en fonction d'ArrayLists. Je vais stocker cette BufferedImage et la réafficher s'il n'y a pas eu de modif et s'il n'y a pas eu redimensionnement.

    Je vous tiens au courant, merci.

Discussions similaires

  1. setPixels fait planter mon appli
    Par Reikiki dans le forum Android
    Réponses: 0
    Dernier message: 12/06/2014, 15h33
  2. OpenFileDialog fait crasher mon appli
    Par Benlev dans le forum C#
    Réponses: 12
    Dernier message: 05/03/2011, 18h47
  3. pourquoi ma boucle fait planté mon appli ?
    Par zerros dans le forum Windows Forms
    Réponses: 5
    Dernier message: 02/05/2009, 16h21
  4. MATLAB fait ramer mon PC
    Par wilito dans le forum MATLAB
    Réponses: 3
    Dernier message: 06/04/2007, 13h48
  5. Réponses: 2
    Dernier message: 08/03/2007, 17h22

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