Existe algum evento para JButton que me diga se o botão está pressionado… ou seja não quero saber se ele foi pressionado… mas se ele está pressionado… por exemplo a cada clique em um botão eu vou somar 1 para uma variavel qq, mas se o clique for longo eu preciso ir somando um enquanto o usuário não solta o botão, como se fosse um loop pelo tempo que ele segurou o clique em um botão…
Valeu Edu4rd0… mas não é bem isso, deixa eu explicar melhor, eu preciso fazer uma contagem enquanto o usuário estiver pressionando o mouse sobre um botão e não só se ele esta selecionado…
Exemplo um usuáaio aperta o mouse sobre um JButton mas leva 10 segundos para soltar o botão, eu preciso que enquanto ele não solte o botão do mouse eu vou somando um a uma variavel…
Edu4rd0 - Valeu pela ajuda eu dei um outro jeito usando Threads…
ficou assim;
Quando o usuário clica no botão eu seto a variavel botaoPressed para true, e chamo uma thread que vai ficar num loop enquanto a variavel botaoPressed for verdadeira, então quando ele solta o botão do mouse lança o evento mouseReleased que para o loop da thread…
[code] btnUp.addMouseListener(new MouseAdapter(){ @Override
public void mousePressed(MouseEvent e) {
botaoPressed = true;
qtdCliques = 0;
(new ThreadIncrementa()).start();
}
Achei esse tópico antigo então decidi usa-lo para não ter que criar outro.
Tentei usar a idéia do eduardo dos while, mas minha aplicação esta travando quando tento isso. O meu problema é ter alguma função que retorne se uma tecla esta em hold, eu estou implementando um jogo e eu não quero que o usuário possa fazer hold em exclusivamente duas teclas.
Gostaria de saber se existe alguma função em java que ajude a saber se uma tecla esta sendo segurada.
Isso seria implementar os métodos keyPressed, keyReleased, keyTyped, para que eu possa saber o estado em que a tecla se encontra?
Tipo o meu código esta com a idéia pronta a única coisa que não funciona é o que acima foi dito pelo Eduardo o botao.isSelected() era uma função dessas para saber se a tecla esta em hold que eu preciso.
Muito obrigado pela ajuda estive esperando bastante tempo por uma resposta.
[quote=Bruto_JPO]Isso seria implementar os métodos keyPressed, keyReleased, keyTyped, para que eu possa saber o estado em que a tecla se encontra?
[/quote]
public void keyPressed( KeyEvent e ){
mPressed = true;
int time = 0;
while( time < 50 ){
time++;
}
if ( mPressed && time == 50 ){
mHold = true;
}
}
public void keyTyped( KeyEvent e ){
mKeyTyped = true;
System.out.println( "mTyped is true" );
}
public void keyReleased( KeyEvent e ){
mKeyUp = true;
System.out.println( "mkeyUp is true" );
}[/code]
Eu tenho três variavéis boolean que ficam em true caso uma das ações seja verdadeira. Tentei implementar a idéia a cima de que se o cara apertou o botão e passou uma fração de tempo a tecla esta em hold, mas por algum motivo que eu não estou sabendo qual é ele sempre entra naquele laço e deixa o mHold em true, parece até que ele só esta checando se o tempo passou e não se o o botão ainda esta pressionado. Tentei também deixar o while assim:
while ( mPressed ){
time++;
}
Mas assim ele fica em um laço infinito e não sai deste trecho.
Então agora só preciso de uma idéia que me ajude a pegar o hold, porque implementar estas interfaces realmente me ajudou.
Sim agora eu posso saber os estados através desta variável boolean, quando ela for true quer dizer que a tecla esta sendo pressionada e se ela for false quer dizer que ela esta na posição inicial de solta.
O problema é que o estado de estar segurando a tecla é entre estas duas ações. Estou trabalhando duro para tentar pegar a fração de tempo que o usuário ficou apertando a tecla. Se o mPressed for true e tiver se passado uma quantia determinada de tempo eu queria colocar o mHold em true dai eu teria a certeza de que o usuário esta segurando a tecla o problema é que esta bem trabalhoso saber o tempo que a tecla demorou para voltar ao estado inicial. Tentei usar um while simples que incrementava uma variável inteira.
int time = 0;
while ( mPressed ){
time++;
if ( time == 5 ){
mPressed = false;
mHold = true;
break;
}
}
Mas isso não funciona na prática então vou tentar usar novamente o tempo do sistema, com o método System.currentTimeMillis(), mas acho que também não vai funcionar porque eu já havia testado antes. Na prática o ideal seria não permitir que a tecla ficasse em hold e que esta pudesse ser apenas Typed, isso seria a melhor solução vou trabalhar nisso o dia todo espero que mais pessoas como a Lina apareçam para me dar uma mão.
[code]public void keyPressed( KeyEvent e ){
mPressed = true;
long timePressed = System.currentTimeMillis();
}
}
public void keyTyped( KeyEvent e ){
mKeyTyped = true;
}
}
public void keyReleased( KeyEvent e ){
mPressed = false;
long timeReleased = System.currentTimeMillis();
}
}[/code]
Foi uma boa idéia só que há uma coisa muito estranha acontecendo, eu fiz isto e estava tentando estipular uma fração de tempo, colocando se este intervalo de tempo entre a ação de pressionar e soltar a tecla fosse por exemplo maior que 0.500 então o hold seria true. Então tentei comparar com zero só para testar e percebi que da true, quer dizer que a subtração dos dois tempos esta dando zero e exatamente zero porque testei com outros valores e da verdadeiro somente para zero.
Não sei porque esta dando exatamente zero, se os dois métodos são chamados em momentos distintos no sistema, e eles sendo zero eu não tenho como estipular os milisegundos que normalmente leva-se para pressionar e soltar uma tecla, eu tenho quase certeza que este tempo é a metade de um segundo ou seja 0.500 milisegundos já tentei comparar com este valor, mas não funcionou.
mPressed = true;
if (inicial_pressed == 0){
inicial_pressed = new Date().getSeconds(); // Esse método é deprecated, pode usar o System.Current
}
else {
final_pressed = new Date().getSeconds(); // Esse método é deprecated, pode usar o System.Current
}
Bem agora já estou conseguindo saber se esta em true o hold isso é ótimo, muito obrigado. A única coisa que não deu certo foi estipular um tempo pro hold, porque o time_final vai aumentando de acordo com o tempo da aplicação, então eu tentei fazer assim:
Bem tudo isto até agora é para que o personagem do meu jogo faça a operação de socar, sendo assim a variável mPunching fica em true, como estou querendo pegar o hold eu coloco essa variável que define se ele pode socar em false, ele só podera socar se ficar apertando o botão continuamente. O jogo esta sendo feito na plataforma android e quanto ao keyCode e KeyEvent não tem mistério estou simplesmente pegando quando o cara apertar a tecla “K”.
Depois que se passa 0.1 o cara não consegue mais socar e fica assim tipo depois que eu seto o mPunching em false uma vez mesmo que eu continue a rodar a aplicação ele não faz mais a ação de socar, vou trabalhar em uma função que resete esse valor porque o que eu quero é que o cara soque quando apertar o botão varias vezes e quando acontecer o hold ele desfira um único soco e volte ao seu estado normal e não fique “socando o ar” ( estado de hold permanente ).
O mTimeFinal deveria devolver realmente os segundos que o cara ficou apertando a tecla. Por exemplo: 2, ou 1. Como o tempo do sistema aumenta ele começa devolvendo 1 ou 2 depois 3 e 4 e assim sucessivamente. Se eu conseguir pegar o tempo real ai sim eu creio que posso criar uma faixa de 1 segundo entre cada vez que o usuário pressionar uma tecla e colocar o mHold em true.
Oi, vi esse tópico e resolvi usa-lo, apesar da minha dúvida ser bem mais básica que a dos anteriores.
Tenho que colocar uma imagem em primeiro plano caso o botão referente aquela imagem (que já está na janela, só que em tamanho menor) for pressionado.
Sou iniciante em JAVA, e fiz de uma maneira que achei a mais simples: fiz um while e quando o botão fosse pressionado a imagem aparecia, mas não deu certo.
Alguma dica?