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 :

Grille magnétique aimentée


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut Grille magnétique aimentée
    Bonjour

    Je cherche à créer une grille magnétique dans mon application afin de pouvoir déplacer des objets et qu'ils pointent dans le point le plus proche de la position de la souri.

    Comment puis je faire cela, je n'ai pas réussi à trouver des informations ou quelques codes pour m'aider.

    Cordialement,

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Points : 393
    Points
    393
    Par défaut
    Je savais pas que ca s'appelle comme ca.

    Sinon le bon plan je pense, c'est de fabriquer un Layout à la main (voir tutorial).

    Quand vous ajouter un Component avec un position (celle de la souris au moment du clique vous concervez cette position absolue).

    Ensuite au moment du calcul du layout (voir tutorial et l'interface à implémenter) si suffit de faire un petit cacul pour fournir la position effective "magnétique" au composant.

    Je trouve l'idée sympa et ca peut me servir alors si vous publiez au fure et à mesure je veux bien collaborer.

    L'idée d'utiliser un Layeur au lieu d'un AbsoluteLayout c'est qu'avec le layer vous pouvez changer la taille de la grille et le calcul fera le reste. C'est bon bien souple.

    ca commence comme ca
    public class MagneticLayout implements LayoutManager2

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    OK pas de souci!

    En faite j'aimerai créer une grille, type t'ableau avec des coordonnées collones et lignes. Car mon logiciel sera un logiciel de dessin d'organigramme donc les formes que l'utilisateur créera se placeron dans des places précises afin que chaque composant de l'organigramme ait une position.

    Qu'est ce qui différent d'une grille à un tableau? Quel est la meilleur approche afin de dessiner une grille comme dans tout logiciel de dessin.

    merci

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Points : 393
    Points
    393
    Par défaut
    Commencez le layout manager dont je parlais; c'est la meilleur approche en java swing

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 252
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par nasriOM Voir le message
    OK pas de souci!

    En faite j'aimerai créer une grille, type t'ableau avec des coordonnées collones et lignes. Car mon logiciel sera un logiciel de dessin d'organigramme donc les formes que l'utilisateur créera se placeron dans des places précises afin que chaque composant de l'organigramme ait une position.

    Qu'est ce qui différent d'une grille à un tableau? Quel est la meilleur approche afin de dessiner une grille comme dans tout logiciel de dessin.

    merci
    je pense que setLayout(new GridLayout(int,int)); pourrait marcher

  6. #6
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Je suis peut être hors sujet, mais quand tu places un objet dans une grille avec chaque case une longeur fixe BOX_SIZE, tu n'as qu'a faire le calcul suivant:

    int PositionX = (obj.getPosX() / BOX_SIZE)*BOX_SIZE;
    int PositionY = (obj.getPosY() / BOX_SIZE)*BOX_SIZE;

    Par l'exemple, imaginons que je drag/drop un objet à la position (55, 42) dans une grille dont les dimensions sont de 10x10 est que BOX_SIZE=10, alors je vais placer l'objet à la position (50;60). Cela donne un effet d'aimant.


    Billy

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    L'approche est bien evidemment de chercher mathématiquement la distance la plus proche des coordonnées de la souris à celles des croix aimentés.

    Mais comment puis je faire pour créer un tableau à 2 dimensions?

    il me faudrai 20colonnes et une infinité de lignes par exemple

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Points : 393
    Points
    393
    Par défaut
    J'ai fait un post avec le layout manager.

    Il suffit quand tu cliques tu ton panel de récupérer le Point de la souris et alors d'ajouter à ton panel le composant que tu désires voir afficher (JLabel par exemple). Biensur à ton panel il faut lui faire monPanel.setLayout(new MagneticLayout());

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    tu pourais me passer le lien de ton post stp

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    Serais se possible de créer un tableau sans voir les contours mais d'insérer dans chaque cellule une image représentant une croix afin de vraiment symboliser une grille.

    Est ce GridLayout serait capable de faire cela?


  11. #11
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Salut,
    J'espère que ce programme te procurera de l'aide tant attendue.
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
     
     
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.event.*;
     
    public class TestGrille{
     
     
    public static void main(String[] args) {
     
        JFrame frame = new JFrame(" Test Grille");
        frame.setSize(400,300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new Grille(20, 20, 25, 25));
        frame.setVisible(true);
     
    }
     
    }
     
    class Grille extends JPanel{
     
     
     
        private int rows;   // nombre de lignes
        private int columns; // nombre de colonnes
        private int hDist;  // distance horizontale entre 2 croix
        private int vDist;  // distance verticale entre 2 croix
        private final int LENGTH = 6; // longueur et hauteur de la croix dessinée
     
        private Point2D start; // point de click de la souris
        private Point2D end;   // point de relachement
     
        public Grille (int r, int c, int hd, int vd)
        {
     
            rows = r;
            columns = c;
            hDist = hd;
            vDist = vd;
     
            addMouseListener(new MouseAdapter(){
     
                public void mousePressed(MouseEvent mEvt)
                {
     
     
                    // si le click est dans la grille:
                    if (mEvt.getPoint().getX() <= (rows * hDist) &&
                         mEvt.getPoint().getY() <= (columns * vDist))
                    {
                        start = mEvt.getPoint();
                        System.out.println("x = "+(int)start.getX() + " y = "+(int)start.getY());
                    }
     
                }
     
     
                public void mouseRelesed(MouseEvent mEvt)
                {
                    start = null;
                    end = null;
     
                }
     
     
     
            });
     
         addMouseMotionListener(new MouseAdapter(){
     
     
                 public void mouseDragged(MouseEvent mEvt)
                {
                    if (mEvt.getPoint().getX() <= (rows * hDist) &&
                                         mEvt.getPoint().getY() <= (columns * vDist))
                    {
                    end = mEvt.getPoint();
                    System.out.println("xm = "+end.getX() + " ym = "+end.getY());
                    repaint();
                    }
                }
     
     
             });
        }
     
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
     
            Graphics2D g2D = (Graphics2D) g;
     
            /* pour une meilleur lisibilité du code, on va séparer
             * le dessin des cellules du dessin des croix bien que
             * ces premieres ne qoient pas vraiment necessaires
             */
     
            /* Commençons par dessiner les lignes horizontales.
             * n'oublier pas que le point avec les coordonnées (0,0)
             * se situe au coin superieur gauche de la fenetre
             */
     
            for(int i = 1; i <= rows; i++)
            g2D.drawLine(0, i * vDist , columns * hDist, i * vDist );
     
            /* dessiner les lignes verticales */
            for(int i = 1; i <= columns; i++)
            g2D.drawLine(i * hDist, 0,  i * hDist, columns * vDist );
     
            /* Dessiner les croix:
             * chaque croix se situe au milieu d'une cellule
             */
     
             for(int i = 1; i <= rows; i++)
             {
                 for (int j = 1; j <= columns; j++)
                 {
                    // une fois on est dans la cellule (i,j):
                    // dessinons une petite ligne horizontale
     
                    int x1 = (i * hDist) - ((hDist + LENGTH) /2);
                    int y1 = (j * vDist) - (vDist / 2);
                    int x2 = x1 + LENGTH;
                    int y2 = y1;
     
                    g2D.drawLine(x1, y1, x2, y2);
     
                    // et une petite ligne verticale
     
                    x1 = (i * hDist) - (hDist / 2);
                    y1 = (j * vDist) - ((vDist + LENGTH) /2);
                    x2 = x1;
                    y2 = y1 + LENGTH;
     
                    g2D.drawLine(x1, y1, x2, y2);
     
                    // Dessinon la ligne que l'utlisateur construit
     
                    if ((start != null) && (end != null))
                    {
                        int sRow = (int)start.getX()/ hDist +1 ;
                        int sCol = (int)start.getY()/ vDist +1;
     
                        int sx =  (sRow * hDist) - (hDist / 2);
                        int sy =  (sCol * vDist) - (vDist / 2);
     
                        int eRow = (int)end.getX()/ hDist +1;
                        int eCol = (int)end.getY()/ vDist +1;
     
                        int ex =  (eRow * hDist) - (hDist / 2);
                        int ey =  (eCol * vDist) - (vDist / 2);
     
                        g2D.drawLine(sx, sy, ex, ey);
     
     
                    }
     
                 }
     
             }
     
        }
     
    }
    "Un remboursement des programmes défectueux serait envisageable mais toute l'industrie du logiciel ferait faillite la première année." Andrew Tanenbaum.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    Merci beaucoup amine, ça m'aide énormément!!

    Il y a un message d'erreur, il faut remplacer: addMouseMotionListener(new MouseAdapter(){

    par: addMouseMotionListener(new MouseMotionAdapter(){

  13. #13
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par nasriOM Voir le message
    Il y a un message d'erreur, il faut remplacer: addMouseMotionListener(new MouseAdapter(){

    par: addMouseMotionListener(new MouseMotionAdapter(){
    Je n'avais aucun message d'erreur car la classe MouseAdapter implémente les interfaces MouseListener et MouseMoutionListener donc elle est plus générale que MouseMotionAdapter.
    En fait, le but des ces classes est entre autre l'esthétique du code par ce que les interfaces citées contiennent beaucoup de méthodes et on a souvent tendance de n'utiliser qu'une ou deux seulement. Donc elle enlèvent l'obligation de redéfinir les autres méthodes.

    A+.
    "Un remboursement des programmes défectueux serait envisageable mais toute l'industrie du logiciel ferait faillite la première année." Andrew Tanenbaum.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    Existe-il une méthode pour ne pas afficher les traits du tableau, comme ça il n'y aura que les croix qui seront visible?

  15. #15
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par nasriOM Voir le message
    Existe-il une méthode pour ne pas afficher les traits du tableau, comme ça il n'y aura que les croix qui seront visible?
    Supprimes les lignes correspondantes dans le code source ou mets les en commentaire.
    "Un remboursement des programmes défectueux serait envisageable mais toute l'industrie du logiciel ferait faillite la première année." Andrew Tanenbaum.

  16. #16
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Salut,

    Pour ajouter la classe grille à ton code, copies le code source de cette dernière dans un fichier que tu nommes Grille.java, et n'oublies pas d'ajouter le mot public à la définition de la classe.
    le fichier Grille contiendra:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class Grille extends JPanel
    {
     // le code de la classe
    }
    et dans la classe frame:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Grille g = new Grille(nLignes, nColonnes, cellWidth, cellHeight);
    getContentPane().add(g);
    Et pour plus de plaisir, ajoute la ligne suivante à la déclaration des champs de la classe Grille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     private ArrayList<Line2D.Double> lines;
    et les lignes suivantes a la méthode mouseReleased: (bien qu'elles figurent déjà dans la méthode 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
    17
    18
    19
    20
    21
    if ((start != null) && (end != null))
                    {
                        int sRow = (int)start.getX()/ hDist +1 ;
                        int sCol = (int)start.getY()/ vDist +1;
     
                        int sx =  (sRow * hDist) - (hDist / 2);
                        int sy =  (sCol * vDist) - (vDist / 2);
     
                        int eRow = (int)end.getX()/ hDist +1;
                        int eCol = (int)end.getY()/ vDist +1;
     
                        int ex =  (eRow * hDist) - (hDist / 2);
                        int ey =  (eCol * vDist) - (vDist / 2);
     
                        lines.add(new Line2D.Double(sx, sy, ex, ey));
     
                    }
     
     
                    start = null;
                    end = null;
    et dans la méthode paintComponent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (Line2D.Double line : lines)
              g2D.draw(line);
    "Un remboursement des programmes défectueux serait envisageable mais toute l'industrie du logiciel ferait faillite la première année." Andrew Tanenbaum.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    En faite lorsque je dessinerai un objet sur ma grille, il se positionnera sur une croix. J'aimerai pouvoir donner des coordonnées à toutes les croix.

    je m'explique lorsque l'utilisateur voudra dessiner son organigramme, il choisira une forme (rectangle, carré, losange) puis soit il glissera la forme, soit il cliquera sur la grille et elle se placera sur une croix.

    J'ai besoin que chaque croix est une des coordonées précises car chaque travail poura etre enregistré en xml et justement j'ai des attribut qui devront etre présent dans le fichier xml.

    les collonnes de ma grille seront classés de cette manière:
    AC, AD, AE, AF

    les lignes seront classées de cette façon:
    3, 4, 5, 6

    Donc la premiere croix en haut à gauche aura comme coordonnée: AC3 car elle appartient à la colonne AC et a la ligne 3

    Donc dans ma 1ere ligne les croix auront comme coordonnées: AC3, AD3, AE3,...
    pour la 1eme ligne: AC4, AD4, AE4...

    ainsi de suite..;

    comment puis je faire pour donné des coordonées à chaque croix.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    J'ai une question un peu bête.

    J'ai déja toutes mes classes de mon logiciel.
    Je veux m'intenant intégré la classe Grille, dans mon application:
    j'ai une classe appelé JFramePrincipale qui contient la fenetre principale.
    Est ce que pour que la grille s'affiche dans cette fenetre, on devrait implementé la classe JFramePrincipale.

    je n'en ai aucune idée, je fais appel à votre aide justement;

    merci

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Amine_sas Voir le message
    et dans la classe frame:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Grille g = new Grille(nLignes, nColonnes, cellWidth, cellHeight);
    getContentPane().add(g);
    En faite il ne reconnait pas getContentPane().add

  20. #20
    Membre averti Avatar de Amine_sas
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 245
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par nasriOM Voir le message
    En faite il ne reconnait pas getContentPane().add
    Si ta classe JFramePrincipale étend JFrame, la méthode getContentPane() doit être reconnue. Je ne pense pas que le problème vient de cette méthode !

    Pour le problème que tu m'as envoyé par mp, je ne comprends pas ce que tu veux faire exactement, tu veux que les cellules soient étiquetées ?
    "Un remboursement des programmes défectueux serait envisageable mais toute l'industrie du logiciel ferait faillite la première année." Andrew Tanenbaum.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/05/2010, 16h10
  2. Désactiver la multi-sélection d'une grille
    Par Riko dans le forum Composants VCL
    Réponses: 6
    Dernier message: 17/06/2003, 09h47
  3. Grille avec saisie & Combos lié
    Par J-P-B dans le forum XMLRAD
    Réponses: 2
    Dernier message: 12/06/2003, 11h08
  4. jaimerais savoir commen creer une grille.......
    Par zephyr dans le forum Flash
    Réponses: 5
    Dernier message: 29/04/2003, 12h14
  5. [VB6] [Interface] Grille avec combobox
    Par khany dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 15/01/2003, 09h55

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