Problema com a propagação de eventos do teclado

Amigos,

Preciso de uma luz sobre o tratamento de eventos no java.

Uso swing e temos que permitir todas as funções sem o uso do mouse, apenas teclado.

Venho enfrentando a seguinte dificuldade:

O ENTER no jformatedText abre um jdialog, estranhamente o ENTER é processado no dialog e vice-versa o ENTER no jdialog é processado no jformatedText .

Uso keyadapter e abro o dialog no KEY_RELEASE.
O jdialog tem um jtable que é fechado ao pressionar a tecla ENTER.

Alguém já passou e contornou essa situação?

grato

mano, se nao ta esquecendo de setar o focus nao ???

Olá.
Não.

Ele muda o focus para o campo e executa o enter que erá de outro componente.

Como vc esta tratandos os eventos dos seus componentes? Tem como vc postar seu código para que possamos análisar.

Em meus aplicativos swing eu uso os KeyListeners e uso também a classe KeyStroker e InputMap para fazer tratamentos do teclado onde eu preciso chamar alguma acão idenpendente de qual componente esteja o foco.

Uso o KeyAdapter.
Estou implementando agora com os KeyStroke e inputmap. Pesquisei sobre isso e achei mais interessante.


Segue o KeyAdpter que use.

public class TratadorEventosTeclado extends KeyAdapter {
@Override
public void keyPressed(KeyEvent evt) {
procesarEvento(KeyEvent.KEY_PRESSED, evt);
}

@Override
public void keyReleased(KeyEvent evt) {
	procesarEvento(KeyEvent.KEY_RELEASED, evt) ;
}


@Override
public void keyTyped(KeyEvent evt) {
	procesarEvento(KeyEvent.KEY_TYPED, evt);
}


   public void procesarEvento(int tipoEvento, KeyEvent evt) {
	logger.debug("KeyEvent " + evt.getKeyCode() );
	if   (frameOrigemComponent instanceof FrenteLojaJPanel) {
		logger.debug("procesarEvento on LoginJPanel" );
		tratarFrenteLoja(tipoEvento, evt);
	}  else {
		throw new TratadorEventosTecladoRuntimeException("keyPressed não foi tratado", frameOrigemComponent);
	}		

}

}

public void tratarFrenteLoja(int tipo, KeyEvent evt) {
int keyCode = evt.getKeyCode();
Component source = (Component)evt.getSource();
FrenteLojaJPanel frenteLoja = (FrenteLojaJPanel)frameOrigemComponent;
ZelusPDVApp zelusPdvApp = frenteLoja.zelusPDVApp;

	switch (tipo) {
	case KeyEvent.KEY_RELEASED: // soltei a tecla
		logger.debug("KEY_PRESSED KeyCode = " + keyCode);
		switch (keyCode) {
		case KeyEvent.VK_F1:
			if (!evt.isControlDown() && !evt.isAltDown() && !evt.isShiftDown()  && !evt.isAltGraphDown()  && !evt.isMetaDown() ) {
				app.comandoExibirAjuda("help");
			}
			break;
		 
		}		
	}
}

}

Análisei seu código e vi que o uso de KeyStroker vai ser o ideial para vc trabalhar com chamadas de ações idenpedente de qual foco seu componente esteja.

Por exemplo neste trecho de código:

Aqui vc está tentando chamar o menu de ajuda. Se vc estiver com uma outra janela aberta e o foco estiver nessa janela você não vai conseguir executar este código.

Tanto KeyAdapter ou KeyListener é executado somente quando o foco esta no componente. Portando o uso do KeyStroker e InputMap e a melhor solução

 switch (tipo) {
case KeyEvent.KEY_RELEASED: // soltei a tecla
logger.debug("KEY_PRESSED KeyCode = " + keyCode);
switch (keyCode) {
case KeyEvent.VK_F1:
if (!evt.isControlDown() && !evt.isAltDown() && !evt.isShiftDown() && !evt.isAltGraphDown() && !evt.isMetaDown() ) {
app.comandoExibirAjuda("help");
}
break;

Concordo com vc.

Fiz o seguinte.

Criei uma classe abstrata para executar as teclas.
Estou com dificuldade de adicionar a tecla no formulário.
Poderia me ajudar?

Bom,
aqui crio a tecla

TeclasAtalho ajudaTeclasAtalho = new TeclasAtalho(getRootPane(),“F1”,KeyEvent.VK_F1,2000) {
@Override
public void acao() {
comandoExibirAjuda(“frenteLoja.html”);
}
};

Nao estou conseguindo adicionar ele no JFrame, como seria?

Amigos, Valeu pela ajuda.

Conegui configurar a tecla de atalho…
Ficou melhor, realmente melhor…

Abracos

Olá

O ENTER não funciona muito bem com tecla de atalho.
Veja, so.
Coloquei o ENTER para acionar um comando em cada objeto.
Porém ele nào funciona quando digito alguma coisa. Somente a primeira vez que entra.

Tenho que mapear cada JFormatted com o seu respectivo enter?

[quote=gustavo.moda]Olá

O ENTER não funciona muito bem com tecla de atalho.
Veja, so.
Coloquei o ENTER para acionar um comando em cada objeto.
Porém ele nào funciona quando digito alguma coisa. Somente a primeira vez que entra.

Tenho que mapear cada JFormatted com o seu respectivo enter?

[/quote]

Já resolvi…

Mapei um actionlist para o esc e o enter em cada componente, sao poucos…

getProdutoFormattedTextField().registerKeyboardAction(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
comando();
}
}, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false), JComponent.WHEN_FOCUSED );