2009-12-30 16 views
4

Je voudrais savoir s'il existe en Java un événement déclenché en continu lorsqu'un bouton de la souris est enfoncé (enfoncé), même si la souris n'est pas déplacée. Je ne pouvais pas le trouver dans MouseListeners typiques:En Java, quel événement est * continuellement * déclenché avec le bouton de la souris enfoncé?

  • mouseDragged est tiré uniquement si l'utilisateur mouvement la souris tout en maintenant le bouton vers le bas
  • mousePressed est tiré qu'une seule fois lorsque le bouton a été pressé

Et c'est à peu près tout. Une idée de comment faire un tel événement?

Vive

jy

+0

Etes-vous sûr de ne pas vouloir dire à plusieurs reprises? Comment feriez-vous face à un nombre infini d'événements? – robertc

+0

Je pensais envoyer un autre fil à faire et attendre. Lorsque le fil revient, si le bouton est toujours activé, recommencez. –

Répondre

5

Le code de James Goodwin ne fonctionnera pas.mousePressed et mouseReleased sont tous les deux lancés à partir du thread de l'interface graphique, donc un blocage dans mousePressed empêchera mouseReleased de se déclencher, ce qui signifie que la boucle continuera indéfiniment.

Si vous avez déjà un thread séparé à traiter, utilisez mousePressed pour indiquer à ce thread que l'événement doit démarrer et mouseReleased pour arrêter.

Si vous n'avez pas de fil séparé et que vous ne voulez pas de soucis, une minuterie est probablement le moyen le plus simple. javadoc on Timer.

Plus précisément, vous devez créer un TimerTask qui fait tout ce que vous voulez faire plusieurs fois et la file d'attente à l'aide Timer.schedule:

Timer timer = new Timer(); 
TimerTask task = new MyTimerTask(); 

private class MyTimerTask extends TimerTask { 
    public void run() { 
     // your code here 
    } 
} 

public void mousePressed(MouseEvent e) { 
    timer.scheduleAtFixedRate(task, 0, 1000); // Time is in milliseconds 
    // The second parameter is delay before the first run 
    // The third is how often to run it 
} 

public void mouseReleased(MouseEvent e) { 
    task.cancel(); 
    // Will not stop execution of task.run() if it is midway 
    // But will guarantee that after this call it runs no more than one more time 
} 

Je suis assez sûr que ce soit la façon la plus simple, comme n'implique pas de faffing avec la communication inter-thread. Oh, et comme Peter l'a dit, vous devrez ajouter du code pour rendre compte à l'utilisateur de la souris sur votre application et de la souris ailleurs.

+0

Merci de m'avoir fait remarquer que le code ne fonctionnerait pas comme prévu, j'avais seulement donné le code comme un exemple approximatif et je n'avais pas testé que cela fonctionnerait réellement. –

+0

Ceci, après quelques modifications, a résolu mon problème parfaitement. Merci! – Fengson

7

Si vous avez besoin de faire quelque chose tandis que le bouton de la souris est en panne, il suffit de commencer quand vous détectez un événement mousePressed puis faites en continu que jusqu'à ce que vous détectez un événement mouseReleased. Vous n'avez alors pas besoin que votre événement se déclenche continuellement. par exemple.

public void mousePressed(MouseEvent e) { 
    someCondition = true; 
    while(someCondition) { 
     //do something 
    } 
} 

public void mouseReleased(MouseEvent e) { 
    someCondition = false; 
} 

EDIT: Comme autres l'ont dit, le code devrait être séparé du fil de l'événement sinon l'appel à mouseReleased obtiendrait bloqué empêchant la boucle de fin.

+0

Vous voudrez probablement vous déconnecter du thread du gestionnaire d'événements. –

8

Il existe une raison évidente pour laquelle cet événement n'est pas disponible dans MouseListener: il va vous spammer avec des événements tels que tout est ralenti. Voulez-vous recevoir cet événement chaque seconde, chaque ms, ou même plus souvent? Si vous en avez besoin, vous devrez le faire vous-même.

Pour effectuer ce processus, vous avez bien sûr besoin de mousePressed et mouseReleased pour déterminer si un bouton est maintenu enfoncé. Ensuite, vous devez exécuter une sorte de boucle qui génère les événements correspondants que vous souhaitez avoir. Vous pouvez également utiliser la fonction d'interrogation, c'est-à-dire étendre votre classe MouseListener afin qu'elle vous indique si un bouton est toujours maintenu enfoncé, et si vous avez besoin de ces événements, vous pouvez interroger activement le bouton. Cela dépend de comment vous voulez utiliser ces événements, quelle approche est la plus appropriée.

1

Il n'y a pas d'événement

Vous pouvez créer votre propre en démarrant une minuterie dans la méthode mousedown et mettre fin à la même minuterie dans le mouseReleased

Vous aurez aussi besoin d'un peu échouent arrêts pour vous assurer que la la minuterie s'arrête quand vous déplacez le movemove sur un autre composant ou même sur un autre cadre ou des parties non java gui

0

Je pense que vous trouverez la réponse non, il n'y a pas un tel événement. Pas seulement pour Java, mais pour tout framework graphique. Cela ne servirait à rien d'autre qu'à bloquer la file d'attente des événements.

Vous devez créer le vôtre en piégeant l'événement de souris vers le bas, puis en programmant un événement de minuterie à intervalles réguliers jusqu'à l'événement de la souris.