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

Interfaces Graphiques en Java Discussion :

Problème avec Graphics


Sujet :

Interfaces Graphiques en Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Problème avec Graphics
    Bonjour,

    J'ai un projet particulier à faire avec jflex où je dois écrire un programme qui doit lire un fichier, analyser le contenu et dessiner une figure. Mon problème n'est pas vraiment cette partie. En fait je n'arrive pas à utiliser Graphics correctement. Je dois dessiner des lignes successivement afin de former une figure un carré par exemple.

    Voici donc mes deux classes qui me permettent de dessiner :

    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
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.Line2D;
    import java.util.ArrayList;
     
    import javax.swing.JPanel;
     
    class Panneau extends JPanel {
     
        ArrayList<Line2D.Double> myList;
        private int x;
        private int y;
        private int lenX;
        private int lenY;
        private int angle;
        private boolean pinceau;
     
        public Panneau(){
            this.myList = new ArrayList<Line2D.Double>();
            this.x = 100;
            this.y = 100;
            this.lenX = 0;
            this.lenY = 0;
            this.pinceau = false;
        }
     
        public void avance(int n){
            if(angle%360==0){
            	lenX = n;
            }
    		else if(angle%360==90 || angle%360==-270){
    			lenY = n;
            }
    		else if(angle%360==-90 || angle%360==270){
                lenY = -n;
    		}
    		else if(angle%360==180 || angle%360==-180){
                lenX = -n;
    		}
            else
    			System.out.println("L'angle n'est pas un multiple de 90");
        }
     
        public void tourne(int n){
            angle+=n;
        }
     
        public void calculPos(){
            this.x += lenX;
            this.y += lenY;
            this.lenX = 0;
            this.lenY = 0;
        }
     
        public void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D)g;
            if(this.pinceau){
            	System.out.println(x + " " + y + " " + lenX + " " + lenY);
                Line2D.Double myLine = new Line2D.Double(x, y, x+lenX, y+lenY);
                myList.add(myLine);
            }
            if(!myList.isEmpty()){
                for (Line2D.Double myList1 : myList) {
                    g2.draw(myList1);
                }
            }
            calculPos();
        }
     
        public void setPinceau(boolean p){
            pinceau = p;
        }
    }
    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
    import java.io.*;
     
    import javax.swing.JFrame;
     
    public class Main {
     
        public static void main(String[] args) 
          throws Exception {
        	if (args.length < 1) {
        		System.out.println("java Main <namefile>");
        		System.exit(1);
        	}
     
        	File input = new File(args[0]);
        	Reader reader = new FileReader(input);
        	Lexer lexer = new Lexer(reader);
            LookAhead1 look = new LookAhead1(lexer);
            ValueEnvironement env = new ValueEnvironement();
     
            Parser parser = new Parser(look);
            try {
            	Programme p = parser.nontermS();
            	System.out.println("The expression is correct");
    			//p.run(env);
            	Panneau pa = new Panneau();
     
        		JFrame f = new JFrame();
        		f.setSize(400,400);
                f.setResizable(false);
                f.add(pa);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
            	pa.setPinceau(true);
            	pa.avance(10);
            	pa.tourne(-90);
            	pa.avance(10);
            	/*Panneau.tourne(-90);
            	Panneau.avance(10);
            	Panneau.tourne(-90);
            	Panneau.avance(10);*/
            }
            catch (Exception e){
            	System.out.println("The expression is not correct.");
            	System.out.println(e);
            }
        }
    }
    Ce sont les classes qui m'intéressent le plus, mon problème avec Graphics c'est qu'il réinitialise à chaque fois mes variables, donc ma liste de Line2D se retrouve vide et mes coordonné remis aux valeurs misent dans le constructeur. Je n'arrive pas à trouver un moyen de modifier mes variables et garder ce changement en mémoire.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ton problème c'est que tu remplis mylist dans paintComponent avec les valeurs X/Y présentent dans la classe, et non pas à la suite des appels aux différentes méthodes tournes / avance que tu as créées. Donc tu fais avancer ton dessin avec ces méthodes, mais paintComponent ne mettra dans la liste que ce qui est présent au moment du dessin. La solution c'est de supprimer ce code de paintComponent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            if(this.pinceau){
            	System.out.println(x + " " + y + " " + lenX + " " + lenY);
                Line2D.Double myLine = new Line2D.Double(x, y, x+lenX, y+lenY);
                myList.add(myLine);
            }
    Et de le mettre dans tes méthodes 'avance'.

    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
        public void avance(int n){
            int lenX = 0;
            int lenY = 0;
            if(angle%360==0){
            	lenX = n;
            }
    		else if(angle%360==90 || angle%360==-270){
    			lenY = n;
            }
    		else if(angle%360==-90 || angle%360==270){
                lenY = -n;
    		}
    		else if(angle%360==180 || angle%360==-180){
                lenX = -n;
    		}
            else
    			System.out.println("L'angle n'est pas un multiple de 90");
            if(this.pinceau){
                Line2D.Double myLine = new Line2D.Double(x, y, x+lenX, y+lenY);
                myList.add(myLine);
            }
             x = x+lenX;
             y = y+lenY;
        }

Discussions similaires

  1. [Graphics] Problème avec paintComponent()
    Par Raiden1234 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 11/02/2008, 19h50
  2. problème avec drawString() - Graphics
    Par Arrakis dans le forum 2D
    Réponses: 5
    Dernier message: 05/12/2007, 23h08
  3. Problème avec l'objet Graphics (couleur)
    Par deadstar62 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 27/08/2007, 13h35
  4. [xsl:fo] problème avec external-graphic
    Par jehlg dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 11/10/2005, 11h57

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