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?
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
E
edilmar
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.
protected boolean processKeyBinding( KeyStroke ks, KeyEvent e, int condition, boolean pressed ) {
if ( e.getKeyCode() == KeyEvent.VK_ESC ) {
doCancel();
return true;
}
...
}
seudimas
Faz assim óÓÓÓÓÓóóó:
JTabletabela=newJTable();KeyAdapterkeyAdapter=newKeyAdapter(){publicvoidkeyPressed(KeyEvente){if(e.getKeyCode()==KeyEvent.VK_ENTER){e.consume();// chame aqui o metodo que processa o evento do botao// processarCliqueBotaoOK();}elseif(e.getKeyCode()==KeyEvent.VK_ESC){e.consume();// chame aqui o metodo que processa o evento do botao// processarCliqueBotaoCANCELAR();}}};tabela.addKeyListener(keyAdapter);