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

Composants Java Discussion :

Drag & drop d'une JTable


Sujet :

Composants Java

  1. #1
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut Drag & drop d'une JTable
    Bonjour a tous.

    Voici mon but : j'aimerais faire en sorte que mes JTable puissent etre movibles... Je m'explique: je ne sais pas si vous voyez sous acces, on peu disposer les tables ou on veux et comme on veux... J'aimerais pouvoir réaliser cela... J'ais une JTable dans un JScrollPane lui meme dans un JPanel assez grand pour recevoir a peu prés 4 table voire 5... Je sais qu'il faut que je mette le layout du JPanel a null... mais ensuite je bloque... Donc si quelqu'un a une idée... ou qqch comme ca, n'hésitez pas à me le dire.... Je vous remercie d'avance pour votre aide

  2. #2
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bonjour,

    As-tu été voir du côté des JInternalFrames ? Si ça ne te plaît pas, je te conseille d'utiliser un AWTEventListener (pour pouvoir intercepter l'évènement et que la JTable ne le reçoive pas), un JLayeredPane (au cas où les JTables se chevauchent), et un GlassPane (va voir ce lien, il pourrait t'être utile).

  3. #3
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    J'ais regardé tout ce que tu m'a indiqué, mais je n'ais pas compris grand chose... si tu avais un exemple concré ca m'aiderais... je te remercie...

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Tu peux toujours t'inspirer de ceci:

    http://jroller.com/page/santhosh?ent...ble_components

  5. #5
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    J'ais bien lu ton lien, j'ais essayé de faire qqch mais je n'y arrive pas... je pense que je n'ais pas le bon grid... c'est vraiment dur le drag&drop... pourtant ton exemple est vraiment clair...

  6. #6
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Ok, alors essaie toujours de t'inspirer de ceci, notamment le LayeredPaneDemo. Il suffit juste de rajouter la gestion des couches (pour que la dernière table déplacée soit en haut).

  7. #7
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    L'idée est pas mal vraiment mais le problème c'est que je veux faire quelquechose qui ressemble a acces... faire ensuite des liens entre les tables affichées... donc elles ne doivent pas se chevaucher ni etre collées les unes aux autres...

  8. #8
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Je fais des recherches depuis deux trois jours et je me demande s'il est possible de faire des liens entre les tables a la facon d'acces.... Quelqu'un sais c'est possible ou pas??? merci d'avance

  9. #9
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2004
    Messages : 102
    Points : 156
    Points
    156
    Par défaut
    Salut,
    c'est tout à fait possible.
    cela demande, cependant, quelques jours de travail.
    La démarche devrait être la suivante :
    - créer un JLayeredPane et le placer dans un panel utilisant un layout BorderLayout
    - tes JTable doivent être placées dans le JLayeredPane sur la même couche ( DEFAULT_LAYER par exemple )
    - A tes JTable tu associes un MouseListener et sur la méthode drag :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       jTable.setBounds(
                                evt.getX(),
                                evt.getY(),
                                jTable.getWidth(),
                                jTable.getHeight());
      JLayeredPane .repaint();
    cependant, il faut faire attention :
    - dans ton handler, evt.getX() , getY() est la position par rapport au coin supérieur gauche de ta JTable, et setBounds attends la position dans le JLayeredPane. Pour cela, va voir dans javax.swing.SwingUtilities où il y a une méthode qui te permet de faire le calcul.
    - le repaint va te faire repaindre tous tes jtables avec une perte de temps non négligeable. Il faut alors mettre en place un petit automate avec 2 états : un état 1 ( normal ) et un état 2 dans lequel tu vas dessiner un simple rectangle symbolisant ta jtable. Tu passes de 1 à 2 sur le premier événement drag et tu passes de 2 à 1 sur le mouseReleased, en mettant à jour les nouvelles limites de ta JTable et en appelant repaint().

    voici un pseudo-code de ton mouseDrag:

    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
     
    switch( state )
    {
        case state_1:
        {
            state = state_2 ;
            initPos = ( evt.getX(), evt.getY() );
            initJTablePos = ( Jtable.getX(), Jtable.getY() );
            break;
        }
        case state_2:
        {
            java.awt.Graphics2D g2 =  JLayeredPane.createGraphics();
            g2.drawRect(initJTablePos.getX() +( x - initPos.x),
                              initJTablePos.getY() + (y - initPos.y),Jtable.getWidth(), jTable.getHeight());
            break;
        }
    }
    si tu codes comme cela, tu vas avoir tes rectangles qui vont obscurcir ton LayeredPane très rapidement sur chaque mouvement de ta souris. il faut donc les effacer.
    Pour cela, il faut passer en mode Xor ton g2 et donc le rendre global. le principe du XOR est de dessiner un objet et il s'efface si tu le redessines au même endroit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    g2.setXORMode(java.awt.Color.black);  // couleur à choisir
    g2.drawRect(currentRectangle) ; // Efface le rectangle précédent
    compute(currentRectangle);       // calcule le nouveau rectangle
    g2.drawRect(currentRectangle) ; // dessine le rectangle courant
    g2.setPaintMode();   // Revient en mode normal 
     
    couleur
    A toi d'adapter le code à ton mouseDrag... un peu de travail...

    Une fois que tu as cela, il va falloir que tu définisses les flèches entre tes tables et que tu les dessines toi même sur le LayeredPane.
    La manière la plus efficace est de définir ton propre UI ( cf méthode setUI() )
    et de surcharger la méthode paint(graphics g, JComponent c) de la manière suivante :
    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
     
    class MyUI extends javax.swing.plaf.basic.LayeredPaneUI
    {
     
    paint(graphics g, JComponent c) 
    {
        super.paint(g,c);
        for ( int k=0 ; k< arrows.length ;k++)
        {
           arrows[k].paint(g,c);
        }
    }
     
    }
     
    ...
     
    void init()
    {
       JLayeredPane.setUI(new MyUI ());
    }
    pour faire tes flèches, je te conseille d'aller voir java.awt.geom.GeneralPath

    C'est comme cela que je m'y prendrais si je devais coder ton besoin.
    Cordialement
    Hery

  10. #10
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Citation Envoyé par Spinoza23
    Je fais des recherches depuis deux trois jours et je me demande s'il est possible de faire des liens entre les tables a la facon d'acces.... Quelqu'un sais c'est possible ou pas??? merci d'avance
    Mon plus gros problème, c'est que je n'ai jamais utilisé ni vu quelqu'un utiliser access. Donc j'ai vraiment du mal à voir

  11. #11
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    En fait sous acces, aprés avoir rempli tes tables, elle s'affichent avec en entete le nom, et dedans les nom de colonnes... lorsque des tables sont liées par des éléments identiques nomcolonne et nomcol par exemple, un trait relie ces deux champs... quelque soit la position de la table... voila... sinon peu etre que tu voi ce qu'est un modèle conceptuel de données... et bien ca y ressemble un peu...

  12. #12
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    J'ais trouvé ce scrennshot de ce qu'étaient les liens entre les tables et c'est tout a fais ce a quoi je veu arriver...
    Images attachées Images attachées  

  13. #13
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    La méthode de hedes a du bon, mais tu gagneras peut-être du temps en utilisant un JDesktopPane (à toi de voir).

    Je te propose un truc dans ce genre :
    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
    public class LinkableInternalFrame extends JInternalFrame {
     
      private JList maListe; // ou JTable, comme tu veux
      private JScrollPane scrollPane;
      ...
     
      /** returns true if this LIF should be linked with the specified one */
      public boolean isLinkableWith(LinkableInternalFame other) {
        ...
      }
     
      /** returns the distance between the LIF's top and the link in pixels */
      public int getLinkHeight(LinkableInternalFrame other) {
        ... // utilise SwingUtilities.convertPoint
      }
     
      /** allows external objects to listen to vertical scrolling, so that they
       *  can react to a change of the link height */
      public void addAdjustmentListener(AdjustmentListener l) {
        scrollPane.getVerticalScrollBar().addAdjustmentListener(l);
      }
    }
     
    public class Link implements AdjustmentListener {
     
      private LinkableInternalFrame frame1, frame2;
     
      private int linkHeight1, linkHeight2;
     
      // constructeur, getters et setters
      // ne pas oublier d'appeler addAdjustmentListener(this)
      // dans le constructeur !
     
      /** update link heights */
      public void adjustmentValueChanged(AdjustmentEvent e) {
        // ça peut améliorer les performances : on ne réagit pas quand il y
        // a pleins d'ajustements successifs (comme quand on fait glisser
        // le thumb)
        if(e.isValueAdjusting())
          return;
     
        LinkableInternalFrame lif = (LinkableInternalFrame)
          SwingUtilities.getAncestorOfClass(
                LinkableInternalFrame.class,
                (Component) e.getSource() );
     
        if(lif.equals(frame1))
          linkHeight1 = frame1.getLinkHeight(frame2);
     
        if(lif.equals(frame2))
          linkHeight2 = frame2.getLinkHeight(frame1);
     
        // on actualise le JDesktopPane
        lif.getParent().repaint();
      }
    }
     
    public class LinkerDesktopPane extends JDesktopPane {
     
      private Collection<Link> links;
     
      // on surcharge toutes les méthodes add(...) d'un coup
      public void addImpl(Component comp, Object constraints, int index) {
        // on ajoute de manière normale
        super.addImpl(comp, constraints, index);
        if(comp instanceof LinkableInternalFrame) {
          LinkableInternalFrame lif = LinkableInternalFrame(comp);
          for(Component c2 : getComponents()) {
            if(c2 instanceof LinkableInternalFrame &&
               (LinkableInternalFrame)c2.isLinkableWith(lif) )
               links.add(new Link(...);
          }
        }
      }
     
      public void paint(Graphics g) {
        super.paint(g);
        paintLinks(g);
      }
     
      private void paintLinks(Graphics g) {
        // a toi de jouer
      }
    }
    Ca pourrait être plus propre en faisant en sorte que les LinkableInternalFrame soient les AdjustableListener et qu'elles envoient des événements particuliers (genre propertyChangeEvent) lorsque l'utilisateur scrolle.

    Dans la classe LinkableInternalFrame, tu voudras surement utiliser les méthodes JList.indexToLocation, ou JTable.getCellRect ainsi que SwingUtilities.convertPoint, pour calculer la hauteur.

    Pour dessiner les Links, hedes t'a bien briefé.

  14. #14
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Oula, c'est bien trop chaud pour moi ca... je suis absolument incapable en si peu de temps de faire cela... (2 jours)... je vais regarder attentivement... et je vais faire de mon mieu... Encore une fois merci !!!

  15. #15
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Euh, c'est à mon avis ce qu'il y a de plus rapide. Les méthodes ne devraient pas être trop longues, vu que ça permet de réutiliser les solutions des problèmes les plus difficiles (écouter les changements de hauteur du lien, créer les liens à l'ajout de la JInternalFrame).

    A ce propos, je crois que j'ai oublié un ou deux petits trucs : le Link devrait avoir une méthode is/setVisible, et écouter les ComponentEvents (quand tu déplaces une fenêtre, il faut repeindre le link, ou la réduis, il faut le masquer).

    Mais bon, c'est vrai qu'en 2 jours, c'est pas évident.

  16. #16
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Citation Envoyé par xavlours
    le Link devrait avoir une méthode is/setVisible, et écouter les ComponentEvents (quand tu déplaces une fenêtre, il faut repeindre le link, ou la réduis, il faut le masquer).
    Tu les as oublié ou??? je suis naze la... il ne me reste que quelques heures... et j'ais baissé les bras... ce n'est pas bien grave... Encore une fois merci !!!

  17. #17
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Désolé, mais je suis aussi très pris, et là, je pense que tes deadlines sont trop courtes pour être dans les temps. Sache qu'ils t'en demandent beaucoup pour un non spécialiste de swing (mais c'est le meilleur moyen d'obtenir le meilleur de toi).

Discussions similaires

  1. Drag and drop sur une PictureBox
    Par abdiouldbody dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 17/06/2009, 16h55
  2. drag and drop sur une listBox?
    Par Mickey.jet dans le forum Delphi
    Réponses: 3
    Dernier message: 30/09/2006, 11h27
  3. Drag and Drop sur une JTree
    Par Xhéras dans le forum Composants
    Réponses: 5
    Dernier message: 07/07/2006, 13h09
  4. Drag and drop d'une structure avec virtualtreeview
    Par laudur dans le forum Composants VCL
    Réponses: 1
    Dernier message: 03/05/2006, 17h14
  5. Drag n Drop d'une image
    Par darkian dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 28/11/2005, 15h40

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