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

  1. #1
    Membre du Club
    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
    Points : 66
    Points
    66
    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 confirmé 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
    Points : 554
    Points
    554
    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 éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    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 du Club
    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
    Points : 66
    Points
    66
    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 éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    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 du Club
    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
    Points : 66
    Points
    66
    Par défaut
    Donc mieux vaut utiliser quoi? :s

  7. #7
    Membre du Club
    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
    Points : 66
    Points
    66
    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 du Club
    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
    Points : 66
    Points
    66
    Par défaut
    Si par contre je fais comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        public void ajoutLiaison (Liaison l) {
            l.setBounds(10,10,100,100);
            l.setBackground(Color.RED);
            tableau.add(l);
            source.stateChanged();
        }
    J' obtiens un beau carré rouge sur mon écran .
    J en conclus donc :
    1) pas bien d utiliser JPanel pour une ligne ... mais que utiliser d'autre ...
    2) probleme dans la methode paint (Graphics g) , car il ne l'affiche pas ...

    Une idée?

  9. #9
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Bon, j'ai pas tout compris à la première méthode, mais déjà je vois un premier pb.

    le paint de ton élément ligne dessine cet élément ligne. Ce qui veut dire que le repère n'est pas le même que celui du JPanel global. Or c'est dans ce dernier que les coordonées de tes objets Materiel sont placés.

    Y'a surement plusieurs moyens de faire, mais la première qui me vient à l'esprit est la suivante:
    La collection de tes liaisons doit ête accessible depuis ton JPanel principal (pourquoi pas un de ses attributs).
    Tu surcharges la méthode paint de ce JPanel. Du coup, ton objet Ligne n'a plus besoin d'être un Composant graphique.

    Si tu tiens à garde Ligne comme élément graphique, dis-le moi j'ai peut être une solution.

  10. #10
    Membre du Club
    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
    Points : 66
    Points
    66
    Par défaut
    He bien dans tous les cas je dois garder l'objet Liaison, car ensuite je dois pouvoir right-click dessus >fenetre de dialogue des proprietes , ... etc comme pour le Materiel en fait.

    Mais là tu me dis que je pourrai laisser ca en tant que Graphics?

    là j ' ai déja une List<Materiel> en attribut de Tableau, donc oui je peux tout a fait faire de meme pour List<Liaison>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void ajoutMateriel (Materiel m) {
            m.setPosition(m.getPosition());
            m.setBackground(null);
            tableau.add(m);
            materiels.add(m);
            m.afficheDialogue();
            source.stateChanged();
        }
    Voilà ce que je fais dans le cas d'un Materiel; j ajoute au JPanel et a la Liste materiels.

    Merci de m'en dire +

    Pour ce qui est de la premiere methode elle n'est pas bonne en fait , car :

    je click sur liaison to > une autre image (label)

    le petit 'v' se met a coté pour checker l'item.

    Mais a chaque modification (stateChanged), je parcours tous les materiels et je removeAll puis je recree ces items. Donc le 'v' disparait ... a voir plus tard ... dans un premier temps cette ligne qui rejoins les deux materiels me plairait bcp

    Mais je bloque :s

  11. #11
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Excuse-moi, mais j'ai pas compris ton dernier post

    Tu peux préciser ce que tu as fait, qui marche et ce qui te bloque?

  12. #12
    Membre du Club
    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
    Points : 66
    Points
    66
    Par défaut
    C'est un détail peu important et pas en rapport avec l'affichage de la ligne

    Oublions donc cela. J y reviendrai peut etre + tard si besoin est ... mais ca devrait aller suffit de reflechir

    Peux tu aller un peu plus loin dans ton idée de la ligne? car c est tjr le flou complet :s

  13. #13
    Membre du Club
    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
    Points : 66
    Points
    66
    Par défaut
    En fait la seule chosea retenir du post incomprit c est que : j ai besoin de pouvoir clicker sur la ligne pour ensuite afficher Popup et voir les proprietes (meme principe que pour Materiel).

    Donc tu me dis que c est possible de ne pas passer par un JPanel ... j avoue ne pas comprendre

  14. #14
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    J'avais pas saisi qu'on devait pouvoir cliquer dessus.
    Si c'est que pour le dessin, on peut se passer sans pb d'un JPanel.

    Là, deux options :
    - soit tu te passes du JPanel, tu dessine direct dans le JPanel général.
    Bon côté : dessin plus simple, pas de pb de chevauchement, ...
    Mauvais côté : Détection des cliques de souris, tu dois alors créer un MouseListener pour le JPanel général et déterminer sur quelle liaison il a cliqué (pas cool à faire à mon avis)

    - soit tu utilises un JPanel que tu dois alors positionner avec le Layout
    Bon côté : Gestion de la souris plus simple
    Mauvais côté : placement moins facile et surtout, si deux liaisons sont proches et que les JPanel se chevauchent, comment détecter quelle liaison a été sélectionnée?

    Honnetement, à ta place, je sais pas trop laquelle choisir, il est même possible qu'une des deux options ne soit pas réalisable. Ceci-dit, la première semble plus réalisable, mais moins orientée objet.

    Peut être d'autres gens se risqueront à donner leur avis?

  15. #15
    Membre du Club
    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
    Points : 66
    Points
    66
    Par défaut
    Cela me semble effectivement spécial ... Je pense pouvoir retomber sur un exemple d appli où l on pouvait draw sur un tableau, et ensuite on pouvait drag & drop les objets dessinés.

    Cela devrait pouvoir me répondre, je vais jeter un oeil

  16. #16
    Membre du Club
    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
    Points : 66
    Points
    66
    Par défaut
    Si ca interesse qqun, le fichier dont je parle ds le post précédent ... :
    http://rafb.net/p/hUn4Fb80.html

  17. #17
    Membre du Club
    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
    Points : 66
    Points
    66
    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

  18. #18
    Membre du Club
    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
    Points : 66
    Points
    66
    Par défaut
    Voilà vous pouvez désormais nier le probleme numéro 2 comme quoi ce fut rapide

  19. #19
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    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.

  20. #20
    Membre du Club
    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
    Points : 66
    Points
    66
    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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