2 assuntos: Maiúsculas e usar enter

13 respostas
E

Amigos, já vi muitos tópicos antes de solicitar ajuda mas nao consigo mesmo.
Preciso forçar o usuario a digitar sempre em maiúsculo e também preciso fazer o ENTER mudar o foco para o campo anterior, assim como é feito pelo TAB.

Sou iniciante e nem nos tópicos eu consegui. Alguém tem um tutorial explicando isso detalhado?

Muito obrigado.

13 Respostas

smkk

você está fazendo aplicação desktop ou web?

G

Uma maneira de resolver seria a sua classe implementar KeyListener e colocar o tratamento dentro dos eventos do KeyListener:

{
            ...
            jTextField1.addKeyListener(this);
            jTextField2.addKeyListener(this);
            jTextField3.addKeyListener(this);
            ...
      }

        public void keyPressed(KeyEvent arg0) {

	}

	public void keyReleased(KeyEvent e) {
		if (e.getKeyCode() == e.VK_ENTER) {
			((JTextField) e.getSource()).transferFocus();
			return;
		}
		if (e.getKeyCode() == e.VK_ESCAPE) {
			((JTextField) e.getSource()).transferFocusBackward();
			return;
		}
		


	}

	public void keyTyped(KeyEvent e) {
		if (Character.isLetter(e.getKeyChar())) {
			String aux = ""+ e.getKeyChar();
			e.setKeyChar( aux.toUpperCase().charAt(0));
		}
	}

Não sei se é a melhor maneira.

ViniGodoy

Põe no construtor do seu JFrame:

// Colocando enter para pular de campo HashSet conj = new HashSet(this.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS)); conj.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0)); this.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, conj);

É muito mais fácil do que ficar adicionando listener em campo por campo.

ViniGodoy

Dê uma lida aqui:
http://java.sun.com/docs/books/tutorial/uiswing/misc/focus.html

e aqui:
http://java.sun.com/javase/6/docs/api/java/awt/Container.html#setFocusTraversalKeys(int,%20java.util.Set)

E

DeskTop

G

ViniGodoy é possivel colocar mais de um tratamento desta maneira que você citou, por exemplo colocar o enter para ir para o próximo e o esc para ir para o componente anterior?

E

ViniGodoy meu caro…
Ficou quase perfeito. rsrs
Mas 180% melhor que antes.
A 'unica imprefeicao 'e que ele tambem perde o foco quando pressionamos ENTER em um botao. Se ele quando estiver com o foco no botao e eu pressionar ENTER executasse o comando do botao seria demais da conta!

Quanto ao gpviany acho que seria mais interessante pressionar seta para cima se desejarmos que o cursor volte ao foco anterior, ficaria mais padrao, acho que o ESC tem mais cara de aborto rsrsr…Calma, abortar uma operacao.

W

Pra voce deixar so maiusculas usa um JFormattedTextField:

try {
            MaskFormatter m = new MaskFormatter("???????????????????");//Cada interrogação representa um caracter
            m.setValidCharacters("ABCDEFGHIJKLMNOPQRSTUVXZ ");//define os caracteres válidos(Não esquece do espaço).
            m.install(jFormattedTextField1);//instala -se no jFormattedtextField
            } catch (ParseException ex) {
            
        }

Ou então adiciona um keyListener(KeyReleased):

jTextField1.addKeyListener(new KeyAdapter() {

       public void keyReleased(KeyEvent e){

       String a = jTextField1.getText();

        if(a.length() >= 10)//Transfere o foco com 10 caracteres.
           jTextField1.transferFocus();

       a = a.toUpperCase();//transforma tudo em maiuscula

       jTextField1.setText(a); //devolve para o jtextField
       }
       });

ps.: è melhor a segunda forma em relação a primeira pois a segunda converte para maiscula e a primeira so aceita maiuscula o que pode ser um incomodo caso a pessoa não saiba que tem q estar com o CAPS LOCK ativado.

acho que é isso espero ter ajudado.

flw

[]'s

peerless

Sim, é possível:

Como você pode ter notado, o setFocusTraversalKeys recebe como parâmetro uma index e um set de mapeamento. Se há uma index (KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS) é pq pode ser indexado várias outras estratégias.

No seu caso, ficaria algo como (além daquilo que você já colocou)

HashSet conj2 = new HashSet(this.getFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS)); conj2.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ESCAPE, 0)); this.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, conj2);

Note a diferença: FORWARD_TRAVERSAL_KEYS e BACKWARD_TRAVERSAL_KEYS (vai e vem)
Pq set? Pq vc pode adicionar mais de uma tecla para determinada ação ser executada.

Entendeu!?

[]s

MrDataFlex

ELIAS COUTINHO:
ViniGodoy meu caro…
Ficou quase perfeito. rsrs
Mas 180% melhor que antes.
A 'unica imprefeicao 'e que ele tambem perde o foco quando pressionamos ENTER em um botao. Se ele quando estiver com o foco no botao e eu pressionar ENTER executasse o comando do botao seria demais da conta!

Quanto ao gpviany acho que seria mais interessante pressionar seta para cima se desejarmos que o cursor volte ao foco anterior, ficaria mais padrao, acho que o ESC tem mais cara de aborto rsrsr…Calma, abortar uma operacao.

Também gostaria de saber!!! Da para ele descobrir, qnd esta sobre o botão, ao invés de pular, executa??

Abraços!

ViniGodoy

O setFocusTransversalKeys é para um container. Se eu não me engano, é possível por seus botões em outro painel e definir nesse painel a troca de foco com tab.

O enter voltará a funcionar como sempre funcionou.

peerless

ViniGodoy:
O setFocusTransversalKeys é para um container. Se eu não me engano, é possível por seus botões em outro painel e definir nesse painel a troca de foco com tab.

O enter voltará a funcionar como sempre funcionou.

Isso é verdade, porém, se não me engano, ele aplica para todos os containers que fazem parte do container. Ai, já não sei se ficaria bem funcional, hehe

J

o código funciona perfeitamente, porém ainda não consegui resolver esse problema no botão.

Preciso fazer um sistema que só aceite maiusculas e que o enter funcione como o tab - porém, NÃO no botão. No botão ele deveria executar o evento respectivo.

Alguém conseguiu implantar esse código, excluindo os botões?

HashSet conj2 = new HashSet(this.getFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS));    
conj2.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ESCAPE, 0));    
this.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, conj2);
Criado 13 de janeiro de 2008
Ultima resposta 3 de dez. de 2008
Respostas 13
Participantes 8