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 :

Tracer une ligne


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut Tracer une ligne
    Petit truc que je tilt pas,

    je sais pertinnement que pour tracer une ligne, il faut passer par : Graphics.drawLine(...)

    Mais, je comprend pas trop plus loin, j'ai donc une methode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public void tracerLigne (Point p1, Point p2) {
        Graphics ligne = new Graphics();
    Lorsque je fais ca, mon bon Netbeans me tape pleins de methodes

    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
     
    public void clearRect(int x, int y, int width, int height) {
                }
                public void clipRect(int x, int y, int width, int height) {
                }
                public void copyArea(int x, int y, int width, int height, int dx, int dy) {
                }
                public Graphics create() {
                }
                public void dispose() {
                }
                public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
                }
                public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer) {
                }
                public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer) {
                }
    Etc , etc ...

    Mais le but n 'est pas de redéfinir la methode, mais juste de tracer cette satanée ligne entre deux points. J ai matté sur l'ami google mais je pige pas trop , ca parle d'Applets, etc... + orienté net donc ...

    Merci de m ' éclairer

  2. #2
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Tu ne dois pas recréer un objet de type Graphics !!!

    Si tu veux dessiner dans un JPanel par exemple, tu dois redéfinir la méthode paint qui a pour paramètre le graphic dont tu as besoin

  3. #3
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Pour dessiner, j'ai l'habitude de faire comme suit:
    tu surchage la méthode paint() de ton composant et tu utilises le Graphics qui t'es donné en paramètre, tu n'as pas à en créer.

    Après, ça fait quelques temps que j'ai pas eu à le faire, mais cherche du coté des tutoriaux, y'a des exemples très simples.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Ahhh ok!

    Donc :

    class Ligne extends JPanel

    et je surcharge, ok ... j'avais pas vu ca comme ca

    Merci bien

  5. #5
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Hum, peut être, peut être pas.
    ça dépend de ce que tu veux exactement.

    Tu peux très bien surchager la méthode paint de JPanel de fond.
    Si c'est juste pour tracer une ligne entre deux images contenues dans un JPanel plus grand, c'est pas utile de créer un JPanel Ligne à mon avis. Surtout que ça risque de te poser des problèmes de placement/chevauchement.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Donc mieux vaut utiliser quoi? :s

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Mmm je tilte pas ... je m explique :

    les images sont droppées sur le panneau. Ensuite on right click sur une image, on a un popup qui apparait et on a un item : liaison to

    quand on clique sur liaison to , on voit l'ensemble des autres images (Materiel) sur le panneau (on voit en fait leur label). Le but est que: on click ca fait le lien entre les deux (j espere etre clair).

    Je fais donc comme suit :
    Cette méthode est apellee a chaque fois que l etat change, donc si un label d une image a changé, si image supprimée, etc ...
    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 majPopup(List<Materiel> materiels) {
            liaison.removeAll();
            for (int i = 0 ; i < materiels.size(); i++) {
                materiel2 = materiels.get(i);
                if (materiel2.getLabel().compareTo(this.label)!=0) {
                    JCheckBoxMenuItem item = new JCheckBoxMenuItem (materiel2.getLabel());
                    item.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            Tableau.getInstance().ajoutLiaison(new Liaison (materiel, materiel2));
                        }
                    });
                    liaison.add(item);
                }
            }  
        }
    On voit bien donc que onClick sur un item dans le popup liaison to > jajoute une liaison au tableau avec les references vers les deux materiels a lier.

    Dans le tableau :
    j ajoute simplement et je modifie l etat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void ajoutLiaison (Liaison l) {
            tableau.add(l);
            source.stateChanged();
        }
    La classe Liaison :

    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 class Liaison extends JPanel {
        private Materiel m1;
        private Materiel m2;
     
        /** Creates a new instance of Liaison */
        public Liaison(Materiel m1, Materiel m2) {
            this.m1 = m1;
            this.m2 = m2;
        }
     
        public void paint(Graphics g) {
            super.paintComponent(g);
            g.drawLine(m1.getPosition().x, m1.getPosition().y, m2.getPosition().x, m2.getPosition().y);
        }
    }
    Mais rien ne se passe quand je fais liaison to .

    je comprend pas :s

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Yeah ca marche presque pour le tracage de ligne, pour ceux que ca interesse :

    La future ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class Liaison extends JComponent implements MouseListener
    Rien d'autre de particulier a faire.

    Dans mon application en general cela se passe de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Tableau.getInstance().ajoutLiaison(new Liaison (materiel, materiel2));
    J'ajoute donc une liaison en lui assignant deux materiels (que la liaison relira).

    Et ensuite, dans Tableau (Le JPanel où je drop les materiels):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
     
            int nbLiaisons = liaisons.size();
            for (int i = 0; i < nbLiaisons; i++) {
                Liaison l = (Liaison) liaisons.get(i);
                Materiel m1 = l.getM1();
                Materiel m2 = l.getM2();
                g2.drawLine(m1.getPosition().x+(m1.getWidth()/2), m1.getPosition().y+(m1.getHeight()/2),
                            m2.getPosition().x+(m2.getWidth()/2), m2.getPosition().y+(m2.getHeight()/2));
            }
        }
    Et donc je trace, en tenant compte de la position des deux matériels.

    Mais deux problemes subsistent en ce matin:
    1) Ne réagit pas au OnClick (pourtant JComponent peut implement MouseListener, donc pas de probleme, surement moi qui foire qque part)

    2) Lorsque je bouge un matériel, la ligne se freeze et j ai juste comme une trainée de pisse (désolé de l'expression) d'un coté de la ligne ... et quand je réajoute un matériel par la suite, le refresh de tout fait en sorte que la ligne se remet bien ...

    Si quelqu un a une idée

    Pour la 2 j ai mon idée, pour la 1 je vois pas

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Voilà vous pouvez désormais nier le probleme numéro 2 comme quoi ce fut rapide

  10. #10
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    La raison est simple, ta classe Liaison n'est pas vraiment un composant. A mon avis, tu peux enlever le extends JComponent, ça ne changera rien.

    Là, tu as utilisé la première méthode que j'ai proposé, et tu as vu qu'il n'est pas trop difficle de dessiner, mais plus dur de récupérer les cliques de la souris

    En fait, la raison pour laquelle ça ne fait rien, c'est que le composant 'Liaison' n'existe pas physiquement, il n'est pas réellement dessiné. Pour t'en convaincre, tu peux surcharger la méthode paint de ton objet ligne pour y mettre une trace et tu verras qu'elle n'est pas appelée, et ceci tout simplement car tu ne l'ajoute pas à un Container.

    En fait, tu as essayé de mélanger les deux solutions. Là, si tu restes comme ça, voilà ce que je te conseille :
    - Enlève le extends JComponent et le implements MouseListener de Liaison
    - Ajoute un MouseListener sur ton Tableau. Dans ce MouseListener, tu devras récupérer les coordonnées de la souris et passer les liaisons une à une pour savoir si l'une d'elle se trouve dessous. Je te le cache pas, ça va être du calcul un peu lourd, mais ça reste du calcul affine, donc réalisable.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Yep juste avant ma pause je me suis rendu compte que c etait pas un composant en soit , a savoir qu'il fallait que je passe par un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       this.setBounds(10,10,100,100);
    dans Liaison, pour voir que l event se passait dans cet endroit et pas sur ma ligne.

    Je vais donc passer par la seconde solution a laquelle j avais penser aussi mais que je trouvais un tant soit peu lourde :p

    Lancons nous

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Avant de me lancer dans des calculs math de l'époque , vais regarder un peu dans swing. Peut etre y a t il un moyen de creer une Ligne et d ensuite tester si un point passe par cette ligne

    Me semblait avoir vu ca , donc

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

Discussions similaires

  1. [FLASH MX2004] Tracer une ligne en temps réel
    Par tomtom- dans le forum Flash
    Réponses: 1
    Dernier message: 16/02/2006, 09h52
  2. Tracer une ligne sur une image
    Par Guillaume602 dans le forum Windows
    Réponses: 5
    Dernier message: 05/01/2006, 20h33
  3. [VB.NET] Tracer une ligne (OnPaint)
    Par Emcy dans le forum Windows Forms
    Réponses: 6
    Dernier message: 24/03/2005, 13h09
  4. [FP]Tracer Une ligne avec Dev-pascal
    Par yffick dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 17/12/2003, 16h33
  5. Tracer une ligne droite sans les interruptions
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 25/11/2002, 01h22

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