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? * Les miniatures sont une matrice de Jlabel P> 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é. P> Quel est le problème dans ce code? P> p>
3 Réponses :
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 code> sur le droptarget code>. P>
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();}
}
}
}
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 code> getStringbounds () code> Méthode (s) renvoyer un Rectangle2D Code> Convient pour une utilisation dans Mouseprimé () Code>. 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.
@Thomas est correct, mais deux alternatives valent la peine de noter:
Ce exemple montre comment faire glisser un composant à l'aide de Le code ci-dessous montre comment utiliser un code: p> jlayeredpane code>; Ce Variation se développe sur le concept; Ceci plus récent exemple utilise une approche similaire. P> li>
MousemotionListener code>; Ce plus complexe exemple utilise le même principe. P> li>
ul>
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.
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