Ler teclado (tipo um Scanner) a partir de janela (JFrame, JApplet etc...)

Ae glr, to produzindo um jogo simples em Java com swing que ja esta em conclusao e surgiu um “problema”:
*Ja procurei que me cansei no Google… Ate porque eh algo que eh dificil de expressar com palavras-chave…
Estava pensando em fazer a parte de digitar o nome pra salvar os scores usando uma tela com JTextField e JButton…

So que vai ficar mto brega a mistura… Qualquer jogo que se preze mostra o campo de digitar nome ao seu proprio estilo… E como o jogo eh todo usando g.draw… com imagens e tudo entao… ficaria horroso.

Surgiu entao tres possibilidades:

  1. Criar um JTextField e um JButton personalizados sobrescrever o metodo que pinta (nunca fiz mas acredito ser possivel)…
  2. Usar KeyListener e fazer uma enorme gambiarra pra ir escrevendo o valor das teclas em um atributo string… So que ia ter alguns problemas… como por exemplo a tecla backspace pra apagar um caractere e um space pra dar espaco… diferenca entre maiusculas e minusculas… etc. Ja vi que essa eh a pior…
  3. Usar o bom e velho System.in pra capturar o teclado, mas, como usá-lo sem ter uma tela de console por perto… eu nao sei. Essa acho que solucionaria o problema do backspace e do space, maisculas e minusculas…

Alguma ideia?
*Segundo um amigo que esta junto na producao do jogo, ele ja viu outro amigo fazendo isso sem usar componentes escrevendo direto na tela… mas e ai? Sera que ele usou o KeyListener? Eh meio duvidoso…
Vlw

Se voce pensa em usar isso mais vezes, talvez seja legal construir um componente mesmo, nao sei se herdando atributos de JTextField, ou desenvolvendo do zero…

A solução com KeyListener não é tão ruim, se você tiver uma fonte que escreva a letra, é só você guardar a string digitada e mandar escrever o texto na tela, com o java2D, como já deve ser feito no resto do seu jogo…

Ja perdendo as esperancas… tentei fazer por KeyListener. Segue o codigo:

private StringBuffer nome = new StringBuffer();

public void keyPressed(KeyEvent e) {
		if ( e.getKeyCode() == KeyEvent.VK_BACK_SPACE ){
			if ( nome.length() > 0 )
				/* Diminui o tamanho do string buffer
				 * apagando o ultimo caractere.*/
				nome.setLength(nome.length() - 1);
			return;
		}

		/* Verifica se a tecla pressionada está
		 * entre A e Z ou é a barra de espaco.*/ 
		if ( e.getKeyCode() >= KeyEvent.VK_A
				&& e.getKeyCode() <= KeyEvent.VK_Z
				|| e.getKeyCode() == KeyEvent.VK_SPACE ) {
			/* Coloca o caractere na ultima
			 * posicao do string buffer.*/
			nome.append(e.getKeyChar());
		}
	}

Ta funcionando… ninguem conhece uma forma de usar o velho bufferedreader ou sei lah system.in pra capturar o teclado da janela mesmo nao?

Lembrei agora… Talvez dê pra facilitar se usar expressoes regulares pra validar a string… ai ele tiraria automaticamente os caracteres invalidos… so colocaria o caso especial do backspace…
Alguem sabe usar regexp ai?

Antes que perguntem… seu eu botar direto: nome.append(e.getKeyChar()); pra qualquer tecla, tem varias que esculhambam colocando uns simbolos malucos como o capslock, backspace etc…

Vlw.

OPA!

Cara, eu estou montando uma engine pros meus jogos 2d, e estava passando pela mesmo dúvida que vc, pois é tosco deixar isso igual ao swing, a gente quer o nosso gráfico né?

Das soluções apresentadas eu penso o seguinte::

  1. KeyListener: cara, aprenda a usar isso, é vital para ter controle do jogos, temos um sistema bem interessante aqui que detectar até sequências de commandos, pra reconhecer tempo de pressionamento de teclas e inclusive comandos como “Hadouken”, baixo+frente+botão. Não repasso o código pois ainda está longe de estar pronto (tem algumas POG nele que precisam ser corrigidas)

  2. JTextField: meu colega, que está participando do desenvolvimento jura que podemos modificar o swing e deixar como quiser, mas swing usa passive rendering (só atualiza quando for preciso), ja o nosso jogo utiliza active rendering (desenha o tempo todo), eu acredito que isso não daria muito certo, apesar dele garantir. Eu não entendo muito pra poder afirmar… Derepente vc terá que criar um tema pra swing ou coisa do tipo…

Acredito que pro seu caso a opção mais recomendada realmente seria usar o KeyListener, e implementar da forma q vc implementou mesmo. Claro que o ideial seria fazer um cursor que corresse o input e tals, mas isso exigiria um pouco mais de trabalho na implementação.

Não intendo qual parte que não está lhe agradando??