Ordem do Foco da tecla TAB

6 respostas
julianofischer

Olá pessoal,
como faço pra saber a ordem pela qual o tab troca o foco dos componentes…

por exemplo
se eu tenho 3 JTextFields no meu formulário (jTxtFld1,jTxtFld2,jTxtFld3)

o foco começa no jTxtFld1, se eu aperto tab vai para o jTxtFld3, se aperto o tab de novo vai para jTxtFld2.

Como faço pra mudar essa ordem?
abraços

6 Respostas

davidhellfire

ola! boa noite

Acho que o que vc procura é um operação presente nos textsFields e tbm em outros componetes JAVA
tenta ver algo referente à clique com botao direito no componente
*EVENTOS
*FOCUS
*focus lost //para definir o que acontecerá quando o componente perder foco “no caso o TAB”
*focus Gained //para definir o que aconterá quando o componente ganhar o foco

<Respondendo sua idéia>
quando aplicar focus lost no jTextField1 o código dentro do evento seria
jTextField2 ganharia o foco.

EM Código:

private void jTextField1 (java.awt.event.FocusEvent evt) {
  jTextField3.requestFocus();
}

BLZ Acho que fui Claro e que isso possa te ajudar

dev.rafael

Cara vc pode usar o método javax.swing.JComponent.setNextFocusableComponent(java.awt.Component)
mas este foi descontinuado na versão 1.4 da JVM. A maneira correta de se fazer isso agora
é extender a class java.awt.FocusTraversalPolicy.

lina

Oi,

A ordem do foco para os componentes é a ordem pelo qual os mesmos são adicionados no container.

Você poderá utilizar a função focusLost para cada componente ou então fazer essa manipulação na unha:

/**
	Método responsável por manipular a ação do TAB para os JTextFields.
	*/
	private void FieldTABAction(final JTextField	ao_principal,final JTextField ao_alvo)
	{
		// Adiciona a tecla e o nome do evento ao mapa de entrada.
		ao_principal.getInputMap(ao_principal.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put
		(
			KeyStroke.getKeyStroke("TAB"),
			"tabAction"
		);
		
		// Adiciona o evento ao mapa de eventos.
		ao_principal.getActionMap().put("tabAction", new AbstractAction() {	
		        	
				public void actionPerformed(ActionEvent	e) {
					
		        		// Requisita o foco para o JTextField2
		        		ao_alvo.requestFocus();		        		
		        	}
		        }
		);
}

E depois da criação dos seus JTextField você deverá chamar este método:

FieldTABAction(jTextField1, jTextField2); // Ao clicar no TAB ele irá executar : JTextField1 para o JTextField2
FieldTABAction(jTextField2, jTextField3); // Ao clicar no TAB ele irá executar : JTextField2 para o 3
FieldTABAction(jTextField3, jTextField1); // Ao clicar no TAB ele irá executar : JTexstField3 para o 1

Se funciona.. eu não sei! rs

Tchauzin!

lina

Oi,

Você poderá tentar fazer o exemplo que fiz na unha para manipulação do TAB. Eu sei que ele funciona muito bem com tabelas :wink:

Tchauzin!

WellingtonRamos

dev.rafael:
Cara vc pode usar o método javax.swing.JComponent.setNextFocusableComponent(java.awt.Component)
mas este foi descontinuado na versão 1.4 da JVM. A maneira correta de se fazer isso agora
é extender a class java.awt.FocusTraversalPolicy.

O setNextFocusableComponent não é uma boa mesmo.
Mas não recomendo usar a FocusTraversalPolicy. Tive muitos problemas em utilizá-la “pura” e fazer uma implementação do zero.
Um dos problemas foi fechar o ciclo de foco (campo1-> campo2->campo3->campo1->etc) isso pq, internamente, todo componente visual utiliza uma implementação dessa classe chamada LayoutFocusTraversalPolicy

O que eu recomendaria é herdar a LayoutFocusTraversalPolicy e reimplementar as assinaturas de FocusTraversalPolicy (FTP)

public Component getComponentAfter(Container aContainer, Component aComponent); public Component getComponentBefore(Container aContainer, Component aComponent); public Component getFirstComponent(Container aContainer); public Component getLastComponent(Container aContainer); public Component getDefaultComponent(Container aContainer);

O ideal é criar algum mecanismo onde possa informar a ordem de foco e definir sua classe de FTP para todos os componentes visuais que vc adiciona na tela.

WellingtonRamos
lina:
Oi,

A ordem do foco para os componentes é a ordem pelo qual os mesmos são adicionados no container.


É verdade, tinha me esquecido disso...

Um problema ao utilizar o lostFocus para isso é se o gainedFocus tbm estiver sendo utilizado.

Se tiver 3 campos (campo1, campo2, campo3, adicionados nessa ordem mas a ordem desejada é campo1, campo3, campo2) e fizer o controle pelo lostFocus, ao trocar o foco do campo1, ele irá disparar o lostFocus do campo1, gainedFocus do campo2, lostFocus do campo2 e gainedFocus do campo3
JPanel panel = new JPanel(new GridLayout(5,1));
	    final JTextField field1 = new JTextField("1");
	    final JTextField field2 = new JTextField("2");
	    final JTextField field3 = new JTextField("3");
	    
	    class FFocus implements FocusListener{
            public void focusGained(FocusEvent e) {
                if(!e.isTemporary()){
                    JTextField source = (JTextField)e.getSource();
                    System.out.println("FocusGained" + source.getText());
                }
            }
            public void focusLost(FocusEvent e) {
                if(!e.isTemporary()){
                    JTextField source = (JTextField)e.getSource();
                    System.out.println("FocusLost" + source.getText());
                    if((source).getText().equals("1")){
                        field3.requestFocus();
                    } else if((source).getText().equals("2")){
                        System.out.println("EU PERDI O FOCO!!! Sou o field 2");
                        //field1.requestFocus();
                        //Só não entra em loop pq está comentado... mas o foco acaba não indo pra quem devia...
                    } else if((source).getText().equals("3")){
                        //Em teoria, field2 não receberia focus. Logo não perderia o mesmo, correto?
                        field2.requestFocus();
                    }
                }
            }
	    }
	    field1.addFocusListener(new FFocus());
	    field2.addFocusListener(new FFocus());
	    field3.addFocusListener(new FFocus());
        panel.add(field1);
        panel.add(field2);
        panel.add(field3);

Ao fazer na unha, deve-se lembrar do foco invertido (Shift+TAB), lembrando que alguns campos, o controle de tab é diferente (JTextArea usa Ctrl+TAB pra trocar de foco e Shift+Ctrl+TAB para o foco inverso).

Criado 29 de abril de 2010
Ultima resposta 30 de abr. de 2010
Respostas 6
Participantes 5