Vários JTextField controlar TAB?

11 respostas
P

Em uma tela de minha aplicação tenho vários JTextFields, como faço para que ao usuário apertar ENTER vá para o próximo JTEXT que eu desejo?
E fazer o mesmo para o TAB também?

Obrigado! 8)

11 Respostas

F

Pois é… Em java não tem um tabOrder…

para fazer isso, acho que o único jeito é implementar um focusListener para cada componente e no focusLost, tu fazer um requestFocus para o componente que tu quer q vá. Acho que é o único jeito…

P

Fernando Generoso da Rosa:
Pois é… Em java não tem um tabOrder…

para fazer isso, acho que o único jeito é implementar um focusListener para cada componente e no focusLost, tu fazer um requestFocus para o componente que tu quer q vá. Acho que é o único jeito…

Você teria algum exemplo de como faz isso?
Teria de controlar os Focus tudo com if?

Valeu! 8)

R

Você já tentou usar nextFocusableComponent?

V

No Java, algumas coisas que em outras linguagens são simples, se tornam bastante complexas…

É melhor entender como funciona o esquema de foco do Swing:
http://java.sun.com/docs/books/tutorial/uiswing/misc/focus.html

É como tentar limitar o tamanho de um JTextField. Você tem que estender algumas classes, colocar código em pontos estratégicos, e esquentar muito a cabeça com algo que em qualquer outra linguagem vc faria setando uma simples propriedade.

I

Isso aqui faz com que os componentes de um determinado JPanel mudem o foco quando precionado enter:

package ivo.testes;

import java.awt.AWTKeyStroke;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.util.HashSet;
import java.util.Set;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class Teste extends JFrame {

	public Teste() throws Exception{
		
		JPanel panel = new JPanel();
		
		Set<AWTKeyStroke> set = new HashSet<AWTKeyStroke>();
		for(AWTKeyStroke key : panel.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS)){
			set.add(key);
		}
		set.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0));
		
		panel.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, set);
		panel.setFocusCycleRoot(true);
		
		panel.setLayout(null);
		JFormattedTextField field = new JFormattedTextField();
		field.setBounds(10, 10, 40, 20);
		panel.add(field);
		
		field = new JFormattedTextField();
		field.setBounds(10, 40, 40, 20);
		panel.add(field);
		
		JButton b = new JButton("teste");
		b.setBounds(70, 10, 70, 20);
		panel.add(b);
		
		field = new JFormattedTextField();
		field.setBounds(70, 40, 40, 20);
		panel.add(field);
		
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		
		add(panel);
		setSize(160, 100);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		try{
			new Teste();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}
P

Colocando seu código exemplo em meu fonte, deu o seguinte erro quando chamo a tela:

Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException

at gui.Tela_Cad.getJContentPane(Tela_Cad.java:89)

at gui.Tela_Cad.getJFrame(Tela_Cad.java:74)

at gui.Tela_Principal$1.actionPerformed(Tela_Principal.java:80)

at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)

at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.setPressed(Unknown Source)

at ch.randelshofer.quaqua.QuaquaButtonListener.mouseReleased(QuaquaButtonListener.java:86)

at java.awt.Component.processMouseEvent(Unknown Source)

at javax.swing.JComponent.processMouseEvent(Unknown Source)

at java.awt.Component.processEvent(Unknown Source)

at java.awt.Container.processEvent(Unknown Source)

at java.awt.Component.dispatchEventImpl(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Window.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.EventQueue.dispatchEvent(Unknown Source)

at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.run(Unknown Source)
I

Faz o seguinte:
execute o meu código (apenas o meu código),
verifica se é isso que vc qué,
entenda o código e transporte para o seu sistema.
Um simples copy/past nem sempre funciona :smiley:

P

É depois dessa acho que não tenho mais nada a perguntar. :shock:

ViniGodoy estive lendo o artigo que me passou e estou tentando adaptar mas está complicado.
Bem que você falou que o que é simples em outras linguagens em java tem que esquentar a cabeça. 8)

I

Eu fiz uma busca no google, tirei um tempo pra fazer esse código pra ti, fiz uma exemplo que funciona e vc ainda vem me dizer que tá dando nullpointer no teu código?

Pelo erro deve ter dado conflito com algum actionPerformed.
Comente todos os actionPerformed da sua tela pra ver se funciona.

Faça perguntas inteligentes

V

Se seu problema é só fazer o enter se comportar como tab, tente colocar esse código aqui no construtor do seu JFrame:

HashSet keys = new HashSet(
   this.getFocusTraversalKeys(
      KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS)); 

keys.add(AWTKeyStroke.getAWTKeyStroke(
   KeyEvent.VK_ENTER, 0));

this.setFocusTraversalKeys(
   KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, keys);

Como o ivo já tinha feito.

P

Ivo desculpe “ter” feito você perder seu precioso tempo sendo que o fórum é de livre e espontânea vontade para quem quer ajudar aos outros (e não obrigarem aos usuários do GUJ a perderem seus tempos!

Vini eu consegui colocando o código no construtor do JFrame. o Enter está funcionando perfeitamente com o Focus, agora vou estudar como delimitar para QUAL componente é o próximo focus.

Ivo obrigado pela ajuda! E pode deixar que eu li o link que me mandou de “Fazer perguntas inteligentes”

Criado 21 de agosto de 2008
Ultima resposta 21 de ago. de 2008
Respostas 11
Participantes 5