Olá pessoal, fiz um trecho de código que na minha situação serviu perfeitamente e acredito que muitos gostariam de ter.(Existem implementações diferentes… mas fiz assim…)
É um simples navegador entre componentes utilizando as setas e o enter, um detalhe é que quando o foco estiver em um botao ele dispara o clique dele e não passa o foco,
nesse caso so passa foco com setas…
Falta implementar navegação quando o foco esta em um JList,JTable, JTabbledPane… mas dai seria muito facil entregar tudo de mão beijada assim…
mas o basicão esta ai galera, quem pensar em criticar pensa de novo e melhora o código pra galera, é mais útil!
Para por pra funcionar o código abaixo só precisa fazer a chamada
makeNavigationListener(pane.getComponents());
onde pane é o painel que contem todos os componentes da tela.
public static void makeNavigationListener(Component[] lis) {
for (final Component jc : lis) {
if(jc instanceof Container){
makeNavigationListener(((Container) jc).getComponents());
}
if (jc instanceof JTextComponent) {
addNavigationListener(jc);
jc.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
jc.setBackground(Color.YELLOW);
}
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
jc.setBackground(Color.WHITE);
}
});
continue;
}
if (jc instanceof JButton) {
addNavigationListener(jc);
continue;
}
if (jc instanceof JComboBox) {
addNavigationListener(jc);
continue;
}
if (jc instanceof JTable) {
addNavigationListener(jc);
continue;
}
}
}
private static void addNavigationListener(final Component component) {
component.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (KeyEvent.VK_UP == e.getKeyCode()) {
component.transferFocusBackward();
}
if (KeyEvent.VK_DOWN == e.getKeyCode()) {
component.transferFocus();
}
if (e.isShiftDown() && KeyEvent.VK_ENTER == e.getKeyCode() && !(component instanceof AbstractButton)) {
component.transferFocusBackward();
} else if (KeyEvent.VK_ENTER == e.getKeyCode() && !(component instanceof AbstractButton)) {
component.transferFocus();
} else if (KeyEvent.VK_ENTER == e.getKeyCode() && component instanceof JButton) {
((JButton) component).doClick();
}
}
});
}
Abraços, e espero que ajude alguém!