Utilitario para navegação com setas e enter com swing

0 respostas
janjan

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!

Criado 29 de fevereiro de 2012
Respostas 0
Participantes 1