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

Graphisme Java Discussion :

Faire un dessin persistent


Sujet :

Graphisme Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Faire un dessin persistent
    Bonjour à toutes et à tous,

    Dans JFrame, j'ai placé un JPanel dans lequel j'ai dessiné un rectangle et un cercle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Panneau extends JPanel{
        public Panneau(String titre){
            setBounds(10, 10, 200, 100);
        }
     
        public void paint(Graphics g){
            setBackground(Color.WHITE);
            g.clearRect(0, 0, 200, 100);
            Color c = g.getColor();
            g.setColor(Color.RED);
            g.fillRect(10, 10, 50, 50);
            g.setColor(Color.BLUE);
            g.fillOval(100, 10, 50, 50);
            g.setColor(c);
    Je compile, je lance : mon rectangle et mon cercle se dessinent : OK.

    Je déplace la fenêtre de mon appli vers l'extérieur de l'écran et, lorsque je la ramène dans l'écran, le rectangle et le cercle se redessinent au fur et à mesure que la fenêtre rentre dans l'écran.

    Même chose si je masque le fenêtre de mon appli par une autre et que je la démasque : le rectangle et le cercle se redessinent.


    Maintenant, je souhaite, à partir d'un évènement extérieur (click sur un bouton par exemple (à 'laide de lEDI NetBeans)) dessiner une ligne dans ce "panneau"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        private void jButton1MouseClicked(java.awt.event.MouseEvent evt){
            Graphics gE = panneau.getGraphics();
            gE.drawLine(10, 10, 100, 100);
        }
    Quand je lance l'appli et que je clique sur le bouton, la ligne est bien dessinée.

    Problème : Si maintenant je refais les déplacements sus-cités, si le rectangle et le cercle se redessinent bien, la ligne ne se redessine plus.

    Comment faire pour qu'elle se redessine ?

    D'une manière générale, comment faire pour que des actions de dessin qui ne sont pas dans la méthode "paint" du composant soient redessinées ?

    Ca fait deux jours que je tourne en rond sur le WEB et (mal cherché sûrement) je n'ai rien trouvé ! Ce problème est pourtant basique.

    Merci de votre aide.

    Pierre.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    salut !
    en fait c'est une réaction normale ...
    tu es d'accord que quand la methode paint() est appelé par le pc pour rafraichir la fenetre, si tu la deplace si elle est masqué puis démasqué...
    maintenant ta méthode jButton1MouseClicked est appelé une fois lors d'un click sur le bouton, le dessin est donc fait juste à cet endroit, et il suffit que tu deplace ta fenetre pour que ton 'pc' appelle ta methode paint() et qui elle n'a aucune connaissance d'une potentielle ligne déssinée préalablement...
    donc moi ce que je te propose s'est de te faire une liste d'élément ElementTodraw par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class ElementToDraw {
    private Rectangle r;
    private int type; // tu défini ton type genre ligne, rectangle eclipse...
     
    public int getType() {...}
    // et tous les accesseur qu'il faut
    }
    et ensuite tu ajoute tous les elements a dessiner dans une liste
    List<ElementToDraw> elements = new ArrayList<ElementToDraw>();
    et ensuite dans ta methode paint tu parcours cette liste et suivant le type tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Iterator<ElementToDraw> iter = elements.iterator;
    while (iter.hasnext()) {
    ElementToDraw element =  iter.next();
    drawLine(element.getRect().x, element.getRect().y ,element.getRect().width ,element.getRect().height);
    }
    ca devrait fonctionner....

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Merci beaucoup "lilou77" pour cette proposition.

    En fait, j'ai mal posé mon problème. J'ai voulu commencer par cet exemple, mais ce n'est pas le bon et je ne pense pas que ta proposition puisse convenir pour faire ce que je souhaite. Je vais essayer de mieux m'expliquer.

    J'ai réalisé, en DELPHI, un logiciel de traitement d'images (voir ici si intéressé) que je voudrais récrire en Java car c'est multiplateforme.

    Dans un tel logiciel (il en existe des tas sur le marché), on peut dessiner sur des images des formes, des lignes à main levées ... tous ces tracés sont persistants lorsqu'on masque puis démasque la fenêtre qui les montre. Or, en DELPHI (je ne sais pas pour les autres langages), il me semble que cette persistance est réalisée par une mémoire de l'image qui est mise à jour à chaque fois qu'on dessine dessus : cela ne fait aucunement appel aux fonctions de dessin qui ont été mises en oeuvre pour y arriver. A mon sens, cela n'a rien à voir avec la fonction "paint" qui est appelée par "repaint()".

    Exemple : avec l'évènement "MouseMove" je dessine un point sur mon espace d'affichage. Symboliquement, la fonction s'écrit :

    Evènement SourisDéplacée(X, Y: Entier) faire
    tracer un point rouge de diamètre 6 pixels en X, Y.

    Il n'y a aucune mémorisation des couples Xi, Yi tracés. Cependant, si on masque et démasque cette image, les points sont retracés.

    Est-ce que ce principe peut être applicable en Java :

    1. dessiner dans un plan image hors écran,
    2. la méthode "repaint()" ou autre (je ne sais pas) ramène cette mémoire à l'écran chaque fois qu'elle est appelée.


    Merci de votre aide.

    Pierre.

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    lilou77 a raison : il faut bien placer la mécanique de dessin dans la méthode paint, ou ses suivantes.

    Tu peux te former aux mystères (qui sont assez bien faits je trouve) du paint dans swing à Performing Custom Painting.

    Avec Delphi, je présume qu'il y avait un cache interne spécial windows ?

  5. #5
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Tu as court-circuité la machinerie interne de Swing. Remplace public void paint(Graphics g) par protected void paintComponent(Graphics g) et laisse le reste du code tel quel.

    Ensuite, pour rendre ton dessin persistant il faut dessiner dans une image. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      private BufferedImage image = new BufferedImage(largeur, hauteur, BufferedImage.TYPE_INT_ARGB);
     
      protected void paintComponent(Graphics g) {
        // ... ton code
        g.drawImage(image, 0, 0, null);
      }
     
      private void jButton1MouseClicked(java.awt.event.MouseEvent evt){
            Graphics gE = image.createGraphics();
            gE.drawLine(10, 10, 100, 100);
            gE.dispose();
        }

  6. #6
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par gifffftane
    [COLOR="Blue"]Tu peux te former aux mystères (qui sont assez bien faits je trouve) du paint dans swing à Performing Custom Painting.
    Je te remercie pour ce lien intéressant que je vais étudier.

    Citation Envoyé par gifffftane
    Avec Delphi, je présume qu'il y avait un cache interne spécial windows ?
    Oui, DELPHI crée une mémoire de l'image hors écran, et c'est celle-ci qui est utilisée pour retracer ce qui a été fait.

    J'ai cherché dans cette voie avec Java et j'ai trouvé ... c'est la même méthode, c'est ce que je me proposais de faire :
    Citation Envoyé par ChP
    Est-ce que ce principe peut être applicable en Java :

    1. dessiner dans un plan image hors écran,
    2. la méthode "repaint()" ou autre (je ne sais pas) ramène cette mémoire à l'écran chaque fois qu'elle est appelée.
    , mais il a fallu que je trouve les bonnes instructions, ce qui m'a pris beaucoup de temps vue ma nullité (pour l'instant en Java).

    C'est en fait à peu de choses près le code que me propose "Gfx" que je remercie ici.

    Cordialement.

    Pierre.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/07/2008, 08h39
  2. Réponses: 3
    Dernier message: 04/04/2007, 23h15
  3. [delphi 7] faire des dessins cliquables
    Par planetevoyage dans le forum Delphi
    Réponses: 8
    Dernier message: 12/10/2006, 08h08
  4. Réponses: 3
    Dernier message: 11/11/2005, 15h52
  5. Libraire pour faire du dessin...????
    Par menuge dans le forum C++
    Réponses: 3
    Dernier message: 02/10/2005, 13h48

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