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

AWT/Swing Java Discussion :

[Drag & Drop][affichage]


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 99
    Par défaut [Drag & Drop][affichage]
    Bonjour,

    je souhaite afficher les objets que je déplace lors d'un drag & drop. D'après ce que j'ai vu il est possible d'utiliser un GhostComponentAdapter comme expliqué sur ce lien : http://gfx.developpez.com/tutoriel/java/swing/drag/

    Cependant lors du Drag & Drop, je souhaite uniquement afficher du texte provenant d'une JList. Y a t-il donc un moyen plus facile de mettre en place cet affichage?

    Merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Par défaut
    ouais, c'est tout a fait possible. Reprend le code dont tu as donné le lien et utilise cette méthode pour récupérer un élément d'une JList :
    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
        public static BufferedImage createTranslucentImageFromListElement(JList list, float transparency) {
            Component comp = list.getCellRenderer().getListCellRendererComponent(
                    list, list.getSelectedValue(), 0, true | false, true | false);
            Rectangle rect = list.getCellBounds(0, 0);
            comp.setSize(rect.width, rect.height);
     
            return createTranslucentImageFromComponent(comp, transparency);
        }
        public static BufferedImage createTranslucentImageFromComponent(Component comp, float transparency) {
            // création d'une image bufferisée avec un efet de transparence
            BufferedImage image = new BufferedImage(comp.getWidth(), comp.getHeight(), BufferedImage.TYPE_INT_ARGB);
            Graphics2D imageGraphics = (Graphics2D) image.getGraphics();
            imageGraphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, transparency));
     
            // récupération de l'UI du composant
            comp.paint(imageGraphics);
            return image;
        }
    (en plus tu as droit à un effet de transparence)

    En utilisant le code de romain guy, tu as juste à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GhostGlassPane.setImage(createTranslucentImageFromListElement(my_jlist, 0.7f));
    Le problème c'est qu'avec cette méthode on ne voit qu'un seul élément de la JList (ce qui est ennuyeux quand on déplace plusieurs éléments). Si tu veux implémenter l'affichage de plusieurs éléments ne te gênes surtout pas !!!

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 99
    Par défaut
    Bonjour,

    tout d'abord, merci pour l'aide!

    J'ai quelques petits problèmes quant à l'utilisation du drag and drop :
    - toute la liste est récupérée et affichée par transparence (pas uniquement les items sélectionnés)
    - l'image ne suit pas vraiment le curseur : elle s'arrête au "premier arrêt de la souris" lors du drag & drop
    - l'image ne disparait pas après le relâchement du curseur

    Pour résoudre ces problèmes, j'aimerais savoir où et quand faut-il déclarer le glasspane (je le fais après la création et l'initialisation de la JList) et de même pour utiliser la méthode setImage() (je le fais dans la méthode importData() du TransferHandler).


    J'ai essayé ceci, qui me permet de corriger une partie d'un point précédent, c'est à dire de ne plus déplacer l'ensemble de la JList (la méthode setImage() n'est plus exécutée dans le TransferHandler) :
    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
     
    public class GhostComponentAdapter extends GhostDropAdapter {
    ...
     
    public void mousePressed(MouseEvent e)
        {
            Component c = e.getComponent();
     
    //        BufferedImage image = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB);
            BufferedImage image = GhostGlassPane.createTranslucentImageFromListElement((JList) c, 0.7f);
     
            Graphics g = image.getGraphics();
            c.paint(g);
     
            glassPane.setVisible(true);
     
            Point p = (Point) e.getPoint().clone();
            SwingUtilities.convertPointToScreen(p, c);
            SwingUtilities.convertPointFromScreen(p, glassPane);
     
            glassPane.setPoint(p);
            glassPane.setImage(image);
     
            glassPane.repaint();
        }
    ...
    }
    Désormais, seul le tout premier item de la liste est affiché lors du drag and drop, par contre ce n'est pas lui que je sélectionne (idem lors des sélections multiples).

    Merci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Par défaut
    j'ai déjà eu ce problème, mais je ne sais plus comment je l'avais résolu :-(. Essai avec ça :
    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
    public abstract class AbstractGhostListener implements MouseListener, MouseMotionListener {
     
        private GhostGlassPane glassPane;
        private List<GhostDropListener> listeners = new ArrayList<GhostDropListener>();
     
     
        /**
         * GhostListener default constructor.
         */
        public AbstractGhostListener(GhostGlassPane glassPane) {
            this.glassPane = glassPane;
        }
     
        public abstract BufferedImage getImage();
     
        @Override
        public void mouseClicked(MouseEvent e) {
            // NOOP
        }
     
        @Override
        public void mousePressed(MouseEvent e) {
            Component c = e.getComponent();
     
            Point p = (Point) e.getPoint().clone();
            SwingUtilities.convertPointToScreen(p, c);
            SwingUtilities.convertPointFromScreen(p, glassPane);
     
            glassPane.setPoint(p);
            glassPane.setImage(getImage());
        }
     
        @Override
        public void mouseReleased(MouseEvent e) {
            Component c = e.getComponent();
     
            Point p = (Point) e.getPoint().clone();
            SwingUtilities.convertPointToScreen(p, c);
     
            Point eventPoint = (Point) p.clone();
            SwingUtilities.convertPointFromScreen(p, glassPane);
     
            glassPane.setPoint(p);
            glassPane.setVisible(false);
            glassPane.setImage(null);
     
            fireGhostDropEvent(new GhostDropEvent(eventPoint));
        }
     
        @Override
        public void mouseEntered(MouseEvent e) {
            // NOOP
        }
     
        @Override
        public void mouseExited(MouseEvent e) {
            // NOOP
        }
     
        @Override
        public void mouseDragged(MouseEvent e) {
            glassPane.setVisible(true);
            Component c = e.getComponent();
     
            Point p = (Point) e.getPoint().clone();
            SwingUtilities.convertPointToScreen(p, c);
            SwingUtilities.convertPointFromScreen(p, glassPane);
            glassPane.setPoint(p);
     
            glassPane.repaint();
        }
     
        @Override
        public void mouseMoved(MouseEvent e) {
            // NOOP
        }
     
     
     
     
        private void fireGhostDropEvent(GhostDropEvent evt) {
            Iterator<GhostDropListener> it = listeners.iterator();
            while (it.hasNext()) {
                it.next().ghostDropped(evt);
            }
        }
     
        public void addGhostDropListener(GhostDropListener listener) {
            if (listener != null)
                listeners.add(listener);
        }
     
        public void removeGhostDropListener(GhostDropListener listener) {
            if (listener != null)
                listeners.remove(listener);
        }
     
    }
    Il s'agit d'une classe abstraite où il faut redéfinir l'image ...

    Et dans la classe GhostGlassPane modifie ça :
    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
    public class GhostGlassPane extends javax.swing.JPanel {
        ...
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);                           // ajouter le super.paintComponent
     
            if (dragged == null) {
                return;
            }
            Graphics2D g2 = (Graphics2D) g;
            g2.drawImage(dragged,
                    (int) (location.getX() - (dragged.getWidth(this) / 2)),
                    (int) (location.getY() - (dragged.getHeight(this) / 2)),
                    null);
     
        }
     
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 99
    Par défaut
    Salut,

    J'ai 2 nouvelles petites questions :

    Quelle est la classe qui doit hériter de AbstractGhostListener ?

    La fonctin
    BufferedImage image = GhostGlassPane.createTranslucentImageFromListElement((JList) c, 0.7f);
    doit-elle être instanciée dans la méthode mousePressed() de GhostComponentAdapter ?

    Merci

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 127
    Par défaut
    Citation Envoyé par nanourene Voir le message
    Quelle est la classe qui doit hériter de AbstractGhostListener ?
    Peut importe la classe où tu l'étend. Voici un exemple :
    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
     
    public class NewJFrame extends javax.swing.JFrame {
     
        /** Creates new form NewJFrame */
        public NewJFrame() {
            initComponents();
     
            GhostGlassPane glasspane = new GhostGlassPane();
            setGlassPane(glasspane);
     
            ListGhostListener listener = new ListGhostListener(glasspane);
            list.addMouseListener(listener);
            list.addMouseMotionListener(listener);
        }
     
        private class ListGhostListener extends AbstractGhostListener {
            public ListGhostListener(GhostGlassPane glasspane) {
                super(glasspane);
            }
     
            @Override
            public BufferedImage getImage() {
                return createImageFromListElement(list, 0.7f);
            }
        }
    }
    Citation Envoyé par nanourene Voir le message
    La fonctin doit-elle être instanciée dans la méthode mousePressed() de GhostComponentAdapter ?
    Merci
    Chez moi j'ai modifié la classe GhostComponentAdapter pour la remplacer par AbstractGhostListener

Discussions similaires

  1. affichage d'une ligne lors d'un drag and drop
    Par jaljal dans le forum Flex
    Réponses: 13
    Dernier message: 09/03/2010, 11h41
  2. [Drag'n'Drop] problème affichage du curseur
    Par julie4207 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 04/09/2008, 09h12
  3. [Drag & Drop]affichage qui se fige
    Par nanourene dans le forum AWT/Swing
    Réponses: 0
    Dernier message: 29/08/2008, 15h47
  4. drag and drop, affichage liste images
    Par nasriOM dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 26/10/2007, 14h13

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