6
votes

Événements de souris Jlabel pour glisser-déposer

Je veux activer la fonctionnalité de glisser-déposer sur un jlabel par des événements de souris remplacés dessus, mais lorsque je défini la traînée et la chute de l'événement de la souris, le Mouseereled ne prend pas effet sur ce Jlabel. Est-ce que je fais quelque chose de mal? XXX

* Les miniatures sont une matrice de Jlabel

Lorsque vous exécutez le programme, les travaux de glisser-déposer, mais l'instruction "ici Souris publiée" Être imprimé. Toutefois, lorsque je supprimai le code responsable du MDN de la méthode de la souris (), "ici Souris publié" est imprimé.

Quel est le problème dans ce code?


3 commentaires

Qu'est-ce que "ne prend pas effet sur le même jlabel" signifie?


Je veux dire que rien ne se passe quand j'ai publié la souris sur le Jlabel, la déclaration "ici Souris publiée" n'a pas imprimé


Il est difficile de voir ce qui ne va pas sans un code minimal qui compile et fonctionne. Pourriez-vous fournir un code SSCCE afin que nous puissions tester et voir pour nous-mêmes? Voir sscce.org


3 Réponses :


6
votes

Eh bien, si je me souviens bien, la machinerie de glisser-déposer attire tous les événements de la souris et les traite lui-même. Ainsi, les souris de souris normaux ne sont plus lancés. Vous auriez besoin d'enregistrer un droptargetlistener sur le droptarget .


0 commentaires

0
votes

Cela doit-il être un jlabel? J'ai fait une classe avec une chaîne qui pourrait vous aider à démarrer ..

import java.awt.Graphics;
import java.awt.MouseInfo;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class mainProgram extends JPanel implements Runnable
{
    private static final long serialVersionUID = 1L;
    public static boolean MOUSE_DOWN = false;
    public static String str;

    public mainProgram() 
    {
        JFrame win = new JFrame("Window");

        win.add(this);

        win.setSize(700,500);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setVisible(true);
        str = "Drag me!";
        new Thread(this).start();
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        if(MOUSE_DOWN)
        {
            g.drawString(str, MouseInfo.getPointerInfo().getLocation().x, MouseInfo.getPointerInfo().getLocation().y);
        }
    }

    @Override
    public void run() 
    {
        Thread t = Thread.currentThread();

        this.addMouseListener(new MouseListener()
        {

            @Override
            public void mouseClicked(MouseEvent arg0) 
            {

            }

            @Override
            public void mouseEntered(MouseEvent arg0) 
            {

            }

            @Override
            public void mouseExited(MouseEvent arg0) 
            {

            }

            @Override
            public void mousePressed(MouseEvent arg0) 
            {
                MOUSE_DOWN = true;
            }

            @Override
            public void mouseReleased(MouseEvent arg0) 
            {
                MOUSE_DOWN = false;
            }

        });

        while(t==Thread.currentThread())
        {
            if(MOUSE_DOWN)
                repaint();

            try {Thread.sleep(10);}
            catch (InterruptedException e) {e.printStackTrace();}
        }   
    }
}


4 commentaires

J'ai essayé votre classe, et ça fait quelque chose de beau, j'ai besoin d'émotion tout en faisant glisser, mais je traite avec Jlabel contient une image à l'intérieur


Cette approche est à noter, mais la mise en œuvre a des problèmes importants. En général, il n'utilise pas correctement les threads, en particulier le fil d'expédition des événements. J'ai suggéré une alternative.


Beau travail améliorant mon code. Nous avons toujours le problème qu'il ne faut réagir que lorsque la souris commence à faire glisser lorsque la souris est sur le texte.


Le FontMeTrics getStringbounds () Méthode (s) renvoyer un Rectangle2D Convient pour une utilisation dans Mouseprimé () . Le exemple cité montre une approche pour plusieurs sélections. BTW, vous devez utiliser @trashgod pour que je puisse voir un commentaire sur votre réponse.



12
votes

@Thomas est correct, mais deux alternatives valent la peine de noter:

  • Ce exemple montre comment faire glisser un composant à l'aide de jlayeredpane ; Ce Variation se développe sur le concept; Ceci plus récent exemple utilise une approche similaire.

  • Le code ci-dessous montre comment utiliser un MousemotionListener ; Ce plus complexe exemple utilise le même principe.

    code: xxx


2 commentaires

Vous avez raison, la deuxième approche est ce que j'ai utilisé dans certains de mes programmes.


+1, bel exemple pour montrer comment faire glisser une peinture personnalisée comme s'opposer à un véritable composant.