JTable x KeyStroke de JButtons

Ola,

Tenho na tela um JTable e 2 JButtons (OK e Cancelar).
Eu vinculei o ENTER para o OK e o ESC para o Cancelar.
Se o foco esta fora do JTable tudo funciona. Mas quando entra no JTable so sai com TAB mesmo, e o ENTER dentro dele muda de linha, e o ESC nao faz nada. Como eu posso enganar o JTable para nao tratar ENTER e ESC?

De que forma você vinculou o Enter e o Esc?

Talvez você tenha que determinar isso ja janela e não nos botôes. Talvez isso ajude:

		int cond = JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT;
		KeyStroke esc =  KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE ,0);
		rootPane.getInputMap(cond).put(esc, COMMAND_CANCEL);
		rootPane.getActionMap().put(COMMAND_CANCEL, actionCancel);	 	
.....

		actionCancel = new AbstractAction(COMMAND_CANCEL){
			public void actionPerformed(ActionEvent e) {
				doCancel();
			}		
		};

doCancel executa de fato a ação ao clicar Esc

Eu fiz este codigo, alterando o meu que estava fazendo o InputMap/ActionMap no JButton e passando para o rootPane.
Contudo, o comportamento continua o mesmo. Parece que o
o teclado fica “sob o dominio” do JTable, e eu tenho que sair
de dentro dele para as coisas funcionarem.

Experimente sobrescrever esse cara aqui.

Mais ou menos assim:

protected boolean processKeyBinding( KeyStroke ks, KeyEvent e, int condition, boolean pressed ) {
   if ( e.getKeyCode() == KeyEvent.VK_ESC ) {
      doCancel();
      return true;
   }
    ...
}

Faz assim óÓÓÓÓÓóóó:

	
	JTable tabela = new JTable();

	KeyAdapter keyAdapter = new KeyAdapter() {
		public void keyPressed(KeyEvent e) {
			if (e.getKeyCode() == KeyEvent.VK_ENTER) {
				e.consume();
				// chame aqui o metodo que processa o evento do botao
				// processarCliqueBotaoOK();
			} else if (e.getKeyCode() == KeyEvent.VK_ESC) {
				e.consume();
				// chame aqui o metodo que processa o evento do botao
				// processarCliqueBotaoCANCELAR();
			}
 		}
	};
		
	tabela.addKeyListener(keyAdapter);