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

AWT/Swing Java Discussion :

Rectangle de sélection, pas génial :/


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 11
    Par défaut Rectangle de sélection, pas génial :/
    Bonjour à tous !!

    Voila, j'ai un JPanel dont chaque pixel a été coloré.

    je souhaiterais utiliser un rectangle de sélection que l'ont trace à la souris.

    Voila ce que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MouseDragged( ... )
    rectWidth = orig_rectX-e.getX();
    rectHeight = orig_rectY-e.getY();
    g.setColor(Color.BLUE);
    g.drawLine(orig_rectX,orig_rectY,orig_rectX,orig_rectY-rectHeight);
    g.drawLine(orig_rectX,orig_rectY,orig_rectX-rectWidth,orig_rectY);
    g.drawLine(e.getX(),e.getY(),orig_rectX,orig_rectY-rectHeight);
    g.drawLine(e.getX(),e.getY(),orig_rectX-rectWidth,orig_rectY );
    En gros, dès que la souris est "Draggée", un rectangle est dessiné sur mon Panel. Ca, ca marche. Mais le rectangle se redessine beaucoup de fois, ce qui fait qu'il se remplit :

    http://img179.imageshack.us/img179/3236/screenzu1.png

    Comment pourrais-je faire, pour dessiner un rectangle a chaque fois, mais qu'il soit effacé pour ne pas avoir cet effet horrible ?

    Merci d'avance et bonne après-midi

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Il faut, avant de dessiner ton rectangle, demander à ton composant de se redessiner dans la zone du rectangle, çà effacera l'ancien rectangle

  3. #3
    Membre chevronné Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Par défaut
    Déjà commence par utiliser le Graphics là où il se trouve :
    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
     
    MouseDragged( ... )  {
       rectWidth = orig_rectX-e.getX();
       rectHeight = orig_rectY-e.getY();
       repaint();
    }
     
    ...
     
    protected void paintComponent(Graphics g) {
       ...
       g.setColor(Color.BLUE);
       g.drawLine(orig_rectX,orig_rectY,orig_rectX,orig_rectY-rectHeight);
       g.drawLine(orig_rectX,orig_rectY,orig_rectX-rectWidth,orig_rectY);
       g.drawLine(e.getX(),e.getY(),orig_rectX,orig_rectY-rectHeight);
       g.drawLine(e.getX(),e.getY(),orig_rectX-rectWidth,orig_rectY );
    }

  4. #4
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Je dirais même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    protected void paintComponent(Graphics g) {
       super.paintComponent(g); // pour effacer le panel
       ...
    }
    Par contre tu vas devoir recalculer toute ton image
    Sauvegarde ton image dans un BufferedImage, et à chaque fois que le panel se redessine, il te suffit d'afficher l'image par Graphics.drawImage()
    Soit qq chose du 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
    private BufferedImage image;
     
    protected void paintComponent(Graphics g) {
       super.paintComponent(g); // pour effacer le panel
       if (image != null) {
          // l'image est supposée calculée
          g.drawImage(image, 0, 0, this);
       }
       g.setColor(Color.BLUE);
       g.drawLine(orig_rectX,orig_rectY,orig_rectX,orig_rectY-rectHeight);
       g.drawLine(orig_rectX,orig_rectY,orig_rectX-rectWidth,orig_rectY);
       g.drawLine(e.getX(),e.getY(),orig_rectX,orig_rectY-rectHeight);
       g.drawLine(e.getX(),e.getY(),orig_rectX-rectWidth,orig_rectY );   
    }
    Edit : Tu peux aussi tracer ton rectangle en mode XOR, ainsi en le dessinant deux fois de suite, il est effacé. Il faut mémoriser la position et la taille du rectangle, le dessiner (pour l'effacer), dessiner le nouveau rectangle, mémoriser sa position et sa taille, et ainsi de suite...

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par herve91 Voir le message

    Par contre tu vas devoir recalculer toute ton image
    component.repaint(x,y,width,height) est plus approprié que repaint() dans ce cas ci et t'efface pas toute ton image du coup (cf clipbox du graphics limitela zone redessinée).

  6. #6
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    component.repaint(x,y,width,height) est plus approprié que repaint() dans ce cas ci et t'efface pas toute ton image du coup (cf clipbox du graphics limitela zone redessinée).
    Oui je suis d'accord, mais en règle générale comment recalculer l'image dans la seule zone du clip ??

Discussions similaires

  1. ne pas afficher le rectangle de sélection
    Par Ragmaxone dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 22/07/2008, 11h27
  2. Réponses: 2
    Dernier message: 24/04/2007, 20h04
  3. Rectangle de sélection "bleuté" style Explorateur
    Par phplive dans le forum Langage
    Réponses: 2
    Dernier message: 02/03/2006, 15h22
  4. Rectangle de sélection
    Par duckaurore dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 12/01/2006, 16h43
  5. [Info]Rectangles de sélection : logiciel de dessin ?
    Par rozwel dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 27/03/2004, 17h49

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