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 :

[JFreeChart] Dessiner par dessus un graphique


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Par défaut [JFreeChart] Dessiner par dessus un graphique
    Bonjour,
    dans mon application en java, j'affiche un graphique avec JFreeChart (j'affiche un ChartPanel donc le comportement est le meme que sur JPanel). Ce que j'aimerais c'est pouvoir dessiner une ellipse en couleur mais légèrement transparente pour qu'on voit encore le graphique par dessus ce graphique afin que l'utilisateur puisse sélectionner une partie des points sur le graphiques.
    Quel est la meilleure solution pour dessiner cette ellipse? superposé des JPanel? utilisé une BufferedImage?
    et si je pouvais avoir un petit exemple pour que je puisse voir rapidement si ça correspond à ce que je recherche, ce serait sympa
    merci

  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
    la meilleur suggestion, deux panels superposé avec le layout approprié. Le panel du dessus serait transparent, surchargerais paintComponent et intercepterais les évènements souris. Regarde du coté de l'overlaylayout

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Par défaut
    L'overlaylayout fait bien se que je voulais au niveau de l'affichage.
    merci pour ton aide tchize_.
    Par contre le déplacement et le redimensionnement de mon ellipse est très saccadé... environ 500 ms entre chaque passage dans mouseDragged alors que le traitement du dragged se fait dans la meme milliseconde (j'ai fait affiché des new Date().getTime au début et à la fin du mouseDragged).
    Je sais pas s'il y a une astuce pour le rendre plus fluide ou ce qui fait que ce soit si saccadé.
    Est-ce que quelqu'un a une idée?

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Donne ton code, car il n'y a aucune raison que ça saccade. Idéalement, il ne faut faire aucune nouvelle instance dans paintComponent ou tes listener.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Par défaut
    Voici mon paintComponent qui va peindre mes ellipses:
    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 void paintComponent(Graphics g){       
             Graphics2D g2d =(Graphics2D)g;
             super.paintComponent(g);  
             if(this._nbRect==0){
                 return;
             }else{
                 if (this._nbRect==1){
                     if (this._popA){
                        this._rectA.paintRect(g2d);
                     }else if (this._popB){
                         this._rectB.paintRect(g2d);
                     }
                 }else{
                     if (this._nbRect ==2){
                         this._rectA.paintRect(g2d);
                         this._rectB.paintRect(g2d);
                     }
                 }
             }
        }
    La fonction painRect appelé dans le 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
    public void paintRect(Graphics2D g2d){
            Color tmp = g2d.getColor();
            Font font = new Font("Arial",Font.BOLD,20);
             g2d.setFont(font);
             g2d.setColor(this._color);
             g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float)0.2F));
             g2d.fillOval((int)this._rect.x,(int)this._rect.y,(int)this._rect.width,(int)this._rect.height);
             g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float)0.5F));
             g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
             g2d.drawString(this._name,(int)(_rect.getMaxX()),(int)(_rect.getMaxY()));
             g2d.setColor(tmp);
             if(this._selected){
                 this.paintRectSelected(g2d);
             }
             g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float)1F));
        }
    et mon mouseDragged (this._selected représente l'objet ChartRectangle (ellipse + son nom) selectionné par la souris :
    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
    21
    22
    23
    24
    25
    26
    public void mouseDragged(MouseEvent e) {
             int xT = e.getX();
             int yT = e.getY();
             if (e.getModifiers() == 16){
            	 if(_curs != 0){
                     int i = _point.x - xT;
                     int j = _point.y - yT;
                     this._selected.deplace(_curs, i, j);
                 }else{
                     if (_selected.isResizable()){
                         this._selected._rect.x += xT - _point.x;
                         this._selected._rect.y += yT - _point.y;
                     }
                 }
                 if(this._dataArea.contains(new Point2D.Double(this._selected._rect.getMinX(),this._selected._rect.getMinY())) &&this._dataArea.contains(new Point2D.Double(this._selected._rect.getMaxX(),this._selected._rect.getMaxY())) && !this._selected._rect.intersects(this._selected != this._rectA ? this._rectA._rect : this._rectB._rect)) 
                 {
                     if (_selected == this._rectA){
                         this._rectA = tmpR;
                     }else if (_selected == this._rectB){
                         this._rectB = tmpR;
                     }
                 this._point = e.getPoint();
                 this.repaint();
                 }
             }             
        }

  6. #6
    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
    vu que çà fait de l'antialisaing, du compositing et tout le toutim, t'as vérifié que le composant en dessous (jfreechart) ne recalcule pas à chaque fois tout le graphe? (si c'est disponible, active y le doublebuffering)

    Met aussi des Date() dans tes méthodes pour voir lesquelles sont les plus longues.

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

Discussions similaires

  1. [API HTML5] <Video> Dessiner par dessus une vidéo
    Par cjacquel dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 14/12/2013, 00h57
  2. Dessiner par-dessus une texture 2D
    Par dream_of_australia dans le forum OpenGL
    Réponses: 5
    Dernier message: 03/10/2009, 19h31
  3. Dessiner par dessus une image
    Par bakaneko dans le forum C++Builder
    Réponses: 9
    Dernier message: 14/07/2007, 05h25
  4. [jtable][jpanel] dessiner par dessus une jtable
    Par tuxor dans le forum Composants
    Réponses: 4
    Dernier message: 22/04/2007, 14h37
  5. [Dx9] Dessiner un curseur par dessus une texture
    Par SteelBox dans le forum DirectX
    Réponses: 16
    Dernier message: 25/04/2005, 20h38

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