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 :

Shape avec couleur? Shape découpable ?


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de poulette3000
    Profil pro
    Inscrit en
    Août 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 183
    Par défaut Shape avec couleur? Shape découpable ?
    Bonjour,

    J’ai crée une classe Graphe qui dérive de JPanel, dans laquelle j’utilise des DrawLine, et aussi une List <Shape> afin d’enregistrer la forme.

    Dans cette JPanel j’ai defini paintComponent
    voici sa definition :
    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
     
    /**
             * Dessin des axes et des graduations 
             */
    	public void paintComponent(Graphics g) {
        	super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
    	// les graduations
    	g2d.drawLine(x+720, y+8, x+720, y);	
    this.afficherAllPoints(g);
    if (app.getPanneauBoutons().getIsPause()) 
    /*SI l’utilisateur a declenché la pause on affiche une forme qui est une
    copie du graphe tracé*/
    			{	
    	for(Shape shape1  :  this.getShapes1()) {
    	        //On dessine la forme
    	        g2d.draw(shape1); /* comme ça je dessine chaque petit bout de ligne qui compose ma <List> Shape que j’ai appelé shapes1 vs verrez plus loin */
    	    		}
    	  for(Shape shape2  :  this.getShapes2()) {
    	        //On dessine la forme
    	        g2d.draw(shape2); /*idem*/
    	    		}
    			}
    Dans cette JPanel je trace un graphe grâce à une fonction qui ulise Drawline & juste après, j’enregistre la forme !
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    public void afficherPoint() {
    Graphics g = this.getGraphics();
    Graphics2D g2d = (Graphics2D) g;
    boolean afficher = true;    // Si le point est à afficher (cela dépend de l'échelle)
     
     
     
    if (i==1 && app.getModele()!=PanneauCuves.MODELE_1_CUVE_DECHRO){
    						g2d.setColor(Color.blue);
    ok = true;
    }
     
    if(ok){
    /*INITIALEMENT tracage de ligne*/g2d.drawLine(abcisseEnCours-1+x, tab_coor[indiceTab-(int)pas][i][0], abcisseEnCours+x, tab_coor[indiceTab][i][0]);
     
    /*je veux un enregsitemnt de la forme ligne*/shapes1.add(new Line2D.Double(abcisseEnCours-1+x, tab_coor[indiceTab-(int)pas][i][0], abcisseEnCours+x, tab_coor[indiceTab][i][0]));
    }
     
    }
    … suite 
    // pour chaque cuve doseuse b 
    else if (i == 4 && nbr_cuve_selectionnee==1 && !app.getPanneauBoutons().getIsManu() && tab_coor[indiceTab2-(int)pas][i][c]!=-1) { 
    							g2d.setColor(Color.BLUE); 
    	if (abcisseEnCours%10 < 5)
    	g2d.setColor(Color.white);
    	ok = true;
    }
    // Courbe du ph objectif
    else if (i == 5) {
    								g2d.setColor(getCouleur(c+2)); /*couleur à mes lignes*/
    	if (abcisseEnCours%16 < 3)
    	g2d.setColor(Color.white);
    	ok=true;
    }
     
    if(ok){
    /*INITIALEMENT*/	g2d.drawLine(abcisseEnCours-1+x, tab_coor[indiceTab-(int)pas][i][c], abcisseEnCours+x, tab_coor[indiceTab][i][c]);
     
    /*ajout des bout de shape*/						
    shapes2.add(new Line2D.Double(abcisseEnCours-1+x, tab_coor[indiceTab-(int)pas][i][c], abcisseEnCours+x, tab_coor[indiceTab][i][c]));
    Comment puis je transmettre la couleur de mes lignes à mes shapes !! :S
    Peut on effacer partiellement un morceau d’une <List> shape ? (des fois si mon graphe prend trop d’abscisse à l’horizontal , j’en efface les premiers morceaux )

    Merci de votre aide , c’est la premiere fois que j’utilise des shapes!

  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
    Bon c'est un peu le dawa tout çà....

    Pour commencer, ne jamais dessiner sur un JPanel en utilisant les graphics obtenus au moyen de getGraphics, ça ne marchera pas correctement....

    Il te suffit juste de redéfinir la méthode paintComponent.

    De même faire un draw d'une Line2D revient exactement à faire un drawLine, donc les opérations que tu effectues dans ton afficherPoint ne doit avoir pour véritable action que d'enregistrer tes Line2D au final.


    En ce qui concerne la couleur tu pourrais parfaitement créer une classe contenant une shape et intégrant d'autres informations comme la couleur & cie.

    Cette classe devra avoir une méthode prenant en paramètre des Graphics2D.

    Puis dans cette méthode tu affectes la couleur à tes Graphics2D par exemple

    puis cette méthode dessine la shape sur les Graphics2D au moyen de la méthode draw.

    ce qui te donnerais au final quelquechose dans ce style



    La classe FormeColorée

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.Shape;
     
     
    public class FormeColoree {
     
        private Shape shape;
        private Color color;
        /**
         * @param shape
         * @param color
         */
        public FormeColoree(Shape shape, Color color) {
            this.shape = shape;
            this.color = color;
        }
        /**
         * @return color
         */
        public Color getColor() {
            return color;
        }
        /**
         * @param color color à définir
         */
        public void setColor(Color color) {
            this.color = color;
        }
        /**
         * @return shape
         */
        public Shape getShape() {
            return shape;
        }
        /**
         * @param shape shape à définir
         */
        public void setShape(Shape shape) {
            this.shape = shape;
        }
     
        public void dessiner(Graphics2D g2d) {
            g2d.setPaint(color);
            g2d.draw(shape);
        }
     
    }

    La classe MonGraphe (quasiment la même que la dernière fois)

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.Shape;
    import java.awt.geom.Line2D;
    import java.awt.geom.Point2D;
    import java.util.ArrayList;
    import java.util.List;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class MonGraphe extends JPanel{
     
        /**
         *
         */
        private static final long serialVersionUID = -3688001984319297948L;
        private List<FormeColoree> formes;
     
        public void addShape(FormeColoree forme) {
             formes.add(forme);
             repaint();
        }
     
        public void addLine(Point2D origine, Point2D destination,Color color) {
            formes.add(new FormeColoree(new Line2D.Double(origine,destination),color));
            repaint();
        }
     
        public void addLine(double x1,double y1, double x2, double y2,Color color) {
            formes.add(new FormeColoree(new Line2D.Double(x1,y1,x2,y2),color));
            repaint();
        }
     
        public MonGraphe() {
            // TODO Raccord de constructeur auto-généré
            super();
            formes = new ArrayList<FormeColoree>();
        }
     
        /*
         * (non-Javadoc)
         *
         * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
         */
        @Override
        protected void paintComponent(Graphics g) {
            // TODO Raccord de méthode auto-généré
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
     
            // Pour que le dessin soit un peu plus "joli"
     
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     
            // Pour chaque forme de la collection
            for(FormeColoree forme  : formes) {
                // On dessine la forme
               forme.dessiner(g2d);
            }
     
        }
     
     
        public static void main(String[] args) {
            MonGraphe graphe = new MonGraphe();
            graphe.addLine(0, 0, 80, 100,Color.red);
            graphe.addLine( 80, 100,200,150,Color.blue);
            graphe.addLine( 200,150,320,100,Color.yellow);
            graphe.addLine( 320, 100,400,0,Color.black);
            graphe.addLine( 0, 150,400,150,Color.pink);
            graphe.addLine( 50, 140,150,140,Color.orange);
            graphe.addLine( 250, 140,350,140,Color.green);
            JFrame f = new JFrame();
            f.add(graphe);
            f.setSize(400,300);
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
     
     
     
    }


    La méthode afficherPoint retravailée:

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     public void afficherPoint() {
            Color color = null;
            boolean afficher = true;    // Si le point est à afficher (cela dépend
                                        // de l'échelle)
     
     
     
            if (i==1 && app.getModele()!=PanneauCuves.MODELE_1_CUVE_DECHRO){
                color = Color.blue;
                ok = true;
            }
     
            if(ok){
     
     
            /* je veux un enregsitemnt de la forme ligne */
                formes.add(new FormeColoree(new Line2D.Double(abcisseEnCours-1+x, tab_coor[indiceTab-(int)pas][i][0], abcisseEnCours+x, tab_coor[indiceTab][i][0]),color));
            }
     
            }
    // pour chaque cuve doseuse b
            else if (i == 4 && nbr_cuve_selectionnee==1 && !app.getPanneauBoutons().getIsManu() && tab_coor[indiceTab2-(int)pas][i][c]!=-1) {
                                        g2d.setColor(Color.BLUE);
                if (abcisseEnCours%10 < 5)
                    color = Color.white;
                ok = true;
            }
    // Courbe du ph objectif
            else if (i == 5) {
                color =  getCouleur(c+2); /*
                                                                             * couleur
                                                                             * à mes
                                                                             * lignes
                                                                             */
                if (abcisseEnCours%16 < 3)
                color = Color.white;
                ok=true;
            }
     
            if(ok){
     
     
            /* ajout des bout de shape */
            formes.add(new FormeColoree(Line2D.Double(abcisseEnCours-1+x, tab_coor[indiceTab-(int)pas][i][c], abcisseEnCours+x, tab_coor[indiceTab][i][c]),color));
     
            }
    Dans ton cas tu dervas appeler la méthode afficherPoint pour initialiser les lignes à dessiner, puis le paintComponent s'occupera du reste...

    Tu es en train de t'embrouiller la tête sur les opérations de dessin, essaie de reprendre çà à tête un tant soit peu plus froide et de réfléchir avant de partir la tête baissée dans le code ( la modélisation ne fait jamais de mal, bien au contraire)

  3. #3
    Membre confirmé Avatar de poulette3000
    Profil pro
    Inscrit en
    Août 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 183
    Par défaut sinok
    "
    Pour commencer, ne jamais dessiner sur un JPanel en utilisant les graphics obtenus au moyen de getGraphics, ça ne marchera pas correctement....
    Il te suffit juste de redéfinir la méthode paintComponent."

    En fait tu vois je reprends des codes de QQun qui bossait la dessus. Mais tu vois
    y a des methodes qui s'occupent du tracage des points ! ces methodes la je suis obligée d'y mettre des getGraphics comment je ferai sinon ? en tout cas, lui en a mis à gogo !

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Graphe extends JPanel
    // avec constructeur
     Graphe(){...}
    //et la 
    public void PaintComponent(graphics g){...........
    }
     
    public void AfficherPoint(){
    .. //la je suis bien obligée d'acceder au graph avec getGraphics
    //je peux pas mettre les calculs et tout dans paintComponent
    }
    SInon comment je peux faire ?

  4. #4
    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
    La méthode afficher point doit simplement voir pour but de préparer les éléments à afficher.
    Les éléments s'affichant d'eux même dans le paintComponent.
    ET tout ce qui aura été affiché par la méthode afficherPoint sera effacé de toute façon au premier repaint passant par là (le moindre déplacement/redimensionnement de fenêtre faisant un appel à repaint).

    Pour moi la méthode afficherPoint ne doit servir qu'à préparer la liste des éléments qui seront automatiquement affichés par la méthode paintComponent

    En fait il faut comprendre le principe selon lequel se dessine les composants Swing.

    A chaque fois qu'un composant swing se dessine,il réinitialise son contexte graphique (cad que ses Graphics sont remis à zéro) puis il fait appel à sa méthode paint. La méthode paint elle même appelle plusieurs méthodes dont celle qui a pour but de dessiner les composant en lui même: la méthode paintComponent.

    Donc si tu dessine sur un JPanel en employant les Graphics obtenu au moyen de getGraphics, tu ne pourras voir ces modifs que tant qu'un repaint n'aura pas été appelé sur la fenêtre, or les appels à repaint sont plus que fréquents en Swing.

    Donc au lieu de vouloir absolument réutilisé quelque chose qui est vicié initialement, je te conseille de plutôt le repenser afin qu'il soit propre.

    Et dans ton cas c'est relativement simple: tu remplaces chaque appel à un drawLine sur les graphics dans la méthode afficherPoint() par un ajout de la Line2D équivalente à tes collection. Puis le paintComponent se chargera de tout afficher comme il le faut.

  5. #5
    Membre confirmé Avatar de poulette3000
    Profil pro
    Inscrit en
    Août 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 183
    Par défaut Exception in thread "AWT-EventQueue-1" java.util.ConcurrentModificationException
    Ca tourne mais difficilement il me met cette erreur

    Exception in thread "AWT-EventQueue-1" java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
    at java.util.AbstractList$Itr.next(Unknown Source)
    at AppletPh2.fenetreGraphe.GraphePh.paintComponent(GraphePh.java:368)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
    at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
    at javax.swing.JComponent._paintImmediately(Unknown Source)
    at javax.swing.JComponent.paintImmediately(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

    Pourtant j'ai bien suivi tes conseils
    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
     
     
    	public void paintComponent(Graphics g) {
        	super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
     
    		//   boolean etatPrecedent;
    		...........suite...........
     
    		// on affiche le graphe deja present
    		this.afficherAllPoints(g);
    		/* je lui dis mais tu vas me les dessiner ces shapes !*/
    		for(Shape shape1  :  this.getShapes1() /*ou shapes1 en fait*/) {
    	        //On dessine la forme
    	        g2d.draw(shape1); 
    	    		}
    	  for(Shape shape2  :  this.getShapes2()) {
    	        //On dessine la forme
    	        g2d.draw(shape2);
    	    		}
    		}
    et la dans afficherPoint()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if (afficher){
    if(ok){
    //On dessine la forme
    shapes1.add(new Line2D.Double(abcisseEnCours-1+x,tab_coor[indiceTab] etc );
    }
    		g2d.setColor(Color.white);
    ok= true ;
    		}
    	shapes2.add(new Line2D.Double(abcisseEnCours-1+x, ....etc );
    }
    voila je suppose que ça signifie que deux methodes veulent acceder au meme element en meme temps , ie ma liste de shapes ?!

    Merci Sinok !

  6. #6
    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
    As tu des threads dans ton appli?

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

Discussions similaires

  1. Récupérer nombre de shapes avec couleur donnée
    Par tiktak28 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 14/12/2012, 09h43
  2. Réponses: 2
    Dernier message: 09/05/2008, 22h36
  3. Réponses: 1
    Dernier message: 09/05/2008, 05h53
  4. Lancer une impression avec un Shape
    Par etorria dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/04/2008, 17h18
  5. shape avec effet relief
    Par SheikYerbouti dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 17/02/2008, 08h36

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