J'essaie actuellement de recevoir des événements clés lors d'un glisser-déposer, mais il me semble que la mise au point est retirée en faisant glisser afin que je ne puisse pas écouter les événements clés.Comment recevoir des événements clés lors d'un glisser-déposer?
Je suis en train de faire glisser une sous-classe JComponent qui implémente KeyListener et demande le focus dans la méthode dragEnter de DragSourceListener, mais mon hypothèse est que le focus est retiré par la suite.
Maintenant, qui a le focus et comment puis-je le ramener à mon JComponent. Ou y at-il une approche différente qui convient mieux à dnd?
Merci d'avance.
MISE À JOUR:
Il y a beaucoup de code nécessaire pour faire ce travail, donc je vais seulement poster quelques extraits pour vous montrer ce que je suis en train de faire:
public class Stone extends JComponent implements Serializable, KeyListener {
public Stone(...) {
//...
setFocusable(true);
addKeyListener(this);
this.dragSource = DragSource.getDefaultDragSource();
this.dgListener = new StoneDGListener();
this.dsListener = new StoneDSListener();
this.dragSource.createDefaultDragGestureRecognizer(
this,
DnDConstants.ACTION_MOVE,
this.dgListener
);
//...
}
//...
public void keyPressed(KeyEvent e) {
System.out.println("Stone: "+e.getKeyCode());
}
//...
public class StoneDSListener implements DragSourceListener, Serializable {
//...
@Override
public void dragEnter(DragSourceDragEvent dsde) {
//...
Stone.this.requestFocus();
addKeyListener(Stone.this);
}
//...
}
}
Qu'est-ce qui se passe est que avant que je suis en train de faire glisser le composant Stone
mon JPanel a le focus afin qu'il reçoive les touches que je suis en train d'appuyer. Pendant le glisser je ne peux pas écouter les touches pressées (donc je ne sais pas qui a le focus), même si je le demande en dragEnter()
et après que je publie le Stone
tous les événements clés sont envoyés au Stone
.
Il est probablement pas important pour la question, mais pour illustrer ce que je fais est ici une capture d'écran:
image showing the "drag" http://img685.imageshack.us/img685/1884/pico.png (Ici je traîne la Stone
de la collection ci-dessous pour le terrain de jeu sur le dessus). Dans cet état, je ne sais pas comment savoir quelles touches sont enfoncées. Je dois comprendre cela afin de pouvoir faire tourner le Stone
.
est-il possible de mettre le code que vous utilisez? Et utilisez-vous un IDE? – medopal
J'ai essayé de mettre autant de code que je le pensais utile. Je ne pense pas que cela fasse une différence, mais j'utilise Eclipse Ganymede sans aucun plugin. Btw. ce n'est pas une applet, mais une application de bureau standard. –