Continuar comando equanto botão estiver pressionado

Olá, tenho um programinha, e nele ao apertar um botão, ele envia um comando pela porta serial.

Eu queria que ao manter o botão pressionado, esse comando fosse mandado repetidamente, até o botão ser liberado.

Eu já tentei o seguinte código, sem successo:

 [code]private void bEsquerdaActionPerformed(java.awt.event.ActionEvent evt) {                                          
    // Motor B Esquerda
    while(bEsquerda.isSelected()){
    enviarString("B+"+velocidade+"\r");
    }[/code]

Alguma idéia ?

que tal tratar o evento quando vc pressiona ? tipo key down?

Basicamente o que o Gilberto disse é que, em vez de usar um ActionListener (que na verdade pega só o “Mouse Released” do clique do botão), você teria de usar um MouseListener mesmo, e tratar os eventos “Mouse Pressed” (para ligar o seu tratamento repetitivo) e “Mouse Released” (para desligar seu tratamento repetitivo).

Note que o loop não pode ficar no tratamento de Mouse Pressed; ele só deve disparar uma thread, ou um timer rápido, ou coisa parecida. O Mouse Released deve desligar o processamento que está nessa thread, ou timer, ou sei lá o quê.

Tenho um exemplo de timer aqui…
Espero q ajude…

import java.util.Timer;
import java.util.TimerTask;

/**
*
* @author homisinho
*/
public class ControlTime {
Timer timer;
boolean Estado;
int Delay;
int Time;
/**
*
* @param func type TimerTask Function to be executed;
* @param d Time before running timer, in second;
* @param t Time to run, in second;
*/
public ControlTime(int d,int t) {
Estado=false;
Delay = d;
Time = t;
}

public void Stop(){
timer.cancel();
Estado = false;
}

public void Play(TimerTask func){
timer = new Timer();
timer.schedule(func,Delay*1000, Time*1000);
Estado = true;
}
/**
*
* @return if time is in use;
*/
public boolean getState(){
return(Estado);
}
}

Para utilizar basta criar o objeto da classe:

public ControlTime tmr_2 = new ControlTime(60, 60);

E depois criar o timetask e passar como parametro:

TimerTask tt = new TimerTask() {
public void run() {
getDados(eq);///metodo qualquer q vc quer q execute
}
};
tmr_2.Play(tt);

E depois pra parar:


tmr_2.Stop();

homisinho

Obrigado pela sua resposta. Deixa eu ver se eu entendi esse código direito. No terceiro código que você coloca, ele implementa a função a ser executada dentro de um método run, isso quer dizer que esse código vai dentro da Thread ?

Mais um coisa, caso vá dentro da Thread, significa que eu terei que criar um uma thread para cada botão que eu precisar disso ? (Pq são no mínimo 10), ou colocar todos os métos dentro dele e fazer um case pra saber qual método executar (uma segunda opção)?