Maison  >  Article  >  Java  >  Comment remplacer les événements de la souris JLabel pour empêcher la consommation d'événements lors du glisser-déposer ?

Comment remplacer les événements de la souris JLabel pour empêcher la consommation d'événements lors du glisser-déposer ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-24 04:50:31819parcourir

How to Override JLabel Mouse Events to Prevent Event Consumption During Drag and Drop?

Événements de souris JLabel pour le glisser-déposer

La fonctionnalité glisser-déposer peut être implémentée sur un JLabel en remplaçant ses événements de souris. Cependant, un problème survient lors de la définition du glisser-déposer dans l'événement mousePressed, car cela empêche l'événement mouseReleased de se déclencher sur le même JLabel.

Implémentation :

<code class="java">Thumbnails[I_Loop].setText("1");
Thumbnails[I_Loop].setTransferHandler(new TransferHandler("text"));
Thumbnails[I_Loop].addMouseListener(new MouseAdapter() {
    public void  mouseReleased(MouseEvent me) {
           System.out.println("here mouse released");
      }
    public void mousePressed(MouseEvent me) {
        System.out.println("here mouse pressed");
        JComponent comp = (JComponent) me.getSource();
        TransferHandler handler = comp.getTransferHandler();
        handler.exportAsDrag(comp, me, TransferHandler.COPY);
    }
});</code>

Dans cet exemple, le L'événement mousePressed est utilisé pour lancer le processus de glisser-déposer, mais il consomme l'événement de souris et empêche le déclenchement de l'événement mouseReleased. Par conséquent, le message « ici la souris est relâchée » n'est pas imprimé.

Approches alternatives :

1. Utilisation de TransferHandler :

Comme @Thomas l'a mentionné, TransferHandler peut être utilisé pour les opérations de glisser-déposer. Il fournit des méthodes telles que exportAsDrag() pour lancer le processus de glissement.

2. Utilisation de MouseMotionListener :

Cette approche écoute les événements de glissement de la souris pour déplacer le composant plutôt que de s'appuyer sur les événements enfoncés et relâchés par la souris.

3. Utilisation de JLayeredPane :

Les composants peuvent être glissés sur un JLayeredPane à l'aide d'événements de souris. Reportez-vous aux exemples de débordement de pile liés pour plus de détails.

Code amélioré :

<code class="java">Thumbnails[I_Loop].setTransferHandler(new TransferHandler("text"));
Thumbnails[I_Loop].addMouseListener(new MouseAdapter() {
    public void  mouseReleased(MouseEvent me) {
           System.out.println("here mouse released");
      }
});
Thumbnails[I_Loop].addMouseMotionListener(new MouseMotionAdapter() {
    @Override
    public void mouseDragged(MouseEvent e) {
        int dx = e.getX() - mousePt.x;
        int dy = e.getY() - mousePt.y;
        Thumbnails[I_Loop].setBounds(Thumbnails[I_Loop].getX() + dx, Thumbnails[I_Loop].getY() + dy, Thumbnails[I_Loop].getWidth(), Thumbnails[I_Loop].getHeight());
    }
});</code>

Cette implémentation utilise MouseMotionListener pour gérer les événements de glissement de la souris et mettre à jour la position du JLabel en conséquence. L'événement mouseReleased est maintenant déclenché et le message "ici souris relâchée" est imprimé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn