Eventos de tecla

10 respostas
N

como faço para cancelar a ação de de uma tecla como a Barckparse em um campo de texto de modo que não faça nada

10 Respostas

mauricioadl
nao sei se eh a forma mais adequada, mais assim funciona:
JTextField jcomp1 = new JTextField(5);
		PlainDocument pd = new PlainDocument() {
			public void remove(int offs, int len)
					throws javax.swing.text.BadLocationException {

			};
		};
		jcomp1.setDocument(pd);

Trava toda a deleção do texto do componente.

J

Creio que desta forma é melhor:

new JTextField().addKeyListener(new KeyAdapter() {
    @Override
    public void keyTyped(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
            e.consume();
        }	    
    }

    @Override
    public void keyPressed(KeyEvent e) {
        keyTyped(e);
    }
});
ViniGodoy

Geralmente o Document é preferível ao keTyped.
Se você realmente quiser evitar APENAS a tecla backspace, use o keyTyped.
Se quiser evitar a exclusão de maneira geral, prefira o Document.

fwsales

Parabéns Vini…
Ficou 10!
Mas como faço funcionar um evento de um JButon que não tem
na JFrame. Exemplo: Tecle F6 para finalizar, ondem não tem
botões na JFrame?
Obrigado!

mauricioadl
fwsales:
Parabéns Vini... Ficou 10! Mas como faço funcionar um evento de um JButon que não tem na JFrame. Exemplo: Tecle F6 para finalizar, ondem não tem botões na JFrame? Obrigado!
Assim pega a aplicacao toda.
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

			public void eventDispatched(AWTEvent event) {
				KeyEvent ev = (KeyEvent) event;

				if (ev.getID() == KeyEvent.KEY_RELEASED) {
					if (ev.getKeyCode() == KeyEvent.VK_F6) {
						System..exit(0);
					}
				}
			}
		}, AWTEvent.KEY_EVENT_MASK);
fwsales

Graaaaande mauricioadl,
Muito obrigado pela força!!
Resolveu meu problema…
Deu certinhoooo!!

fwsales

Pra finalizar, como ficou o construtor:

public cad_transacao() {
        initComponents();
        setLocationRelativeTo(null);
        iniciar_venda();
        puxar_ultimo_codigo();
        tmHoraSaida.start();
        tfDataSaida.setText(dataF.format(new Date()));



        Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

            public void eventDispatched(AWTEvent event) {
                KeyEvent ev = (KeyEvent) event;
                if (ev.getID() == KeyEvent.KEY_RELEASED) {
                    if (ev.getKeyCode() == KeyEvent.VK_F5) {
                        iniciar_venda();
                        puxar_ultimo_codigo();
                    } else if (ev.getKeyCode() == KeyEvent.VK_F6) {
                        teclaF6_finaliza_venda();
                    } else if (ev.getKeyCode() == KeyEvent.VK_F7) {
                        tfRecebido.requestFocus();
                    } else if (ev.getKeyCode() == KeyEvent.VK_F8) {
                        tfQuantidadeUnidade.requestFocus();
                    } else {
                        return;
                    }
                }
            }
        }, AWTEvent.KEY_EVENT_MASK);
        tfCodigoBarras.requestFocus();
    }
ViniGodoy

Cuidado que o AWTEventListener funciona para a aplicação inteira, mesmo que sua tela esteja fechada.

Na verdade, você não deveria registrar nada nesse listener, nunca. Não sei de onde o pessoal tem tirado código usando isso aí ultimamente, é o segundo tópico nessa semana.

Para criar teclas de atalho em seu JFrame, você deve usar uma combinação do ActionMap e o KeyMap, como eu já havia lhe indicado no outro tópico:

Dê uma olhada:


ViniGodoy

Da forma correta vai ficar mais ou menos assim:

public cad_transacao() {  
    initComponents();  
    setLocationRelativeTo(null);  
    registrar_atalhos();
    iniciar_venda();  
    puxar_ultimo_codigo();  
    tmHoraSaida.start();  
    tfDataSaida.setText(dataF.format(new Date()));  
    tfCodigoBarras.requestFocusInWindow();  
}  

private void registrarAtalhos() {
    JPanel painel = ((JPanel)getContentPane());
    //Criamos as ações
    ActionMap actionMap = painel.getActionMap();  
    actionMap.put("novaVenda", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            iniciar_venda();  
            puxar_ultimo_codigo();  
        }
    });
    actionMap.put("finalizarVenda", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            teclaF6_finaliza_venda();  
        }
    });
    actionMap.put("irParaRecebido", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            tfRecebido.requestFocusInWindow();  
        }
    });
    actionMap.put("irParaQuantidade", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent evt) {
            tfQuantidadeUnidade.requestFocusInWindow();  
        }
    });

   //Registramos os botões que queremos para as ações
   InputMap imap = painel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
   imap.put(KeyStroke.getKeyStroke("F5"), "novaVenda");  
   imap.put(KeyStroke.getKeyStroke("F6"), "finalizarVenda");  
   imap.put(KeyStroke.getKeyStroke("F7"), "irParaRecebido");  
   imap.put(KeyStroke.getKeyStroke("F8"), "irParaQuantidade");  
}

Observe que, conforme a documentação orienta, usei o método requestFocusInWindow, e não o requestFocus, como vc vinha usando. O requestFocus() não é multiplataforma.

"Documentação do requestFocus()":
Because the focus behavior of this method is platform-dependent, developers are strongly encouraged to use requestFocusInWindow when possible.

Fonte: http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#requestFocus%28%29

Além disso, você poderia criar as ações como classes separadas (pode ser na forma de classes internas). A vantagem é que você poderia usar a mesma ação em diferentes locais (no ActionMap, botões, menus, etc). As ações permitem que você configure também o texto, tecla aceleradora, ícone, etc, facilitando o trabalho de montar uma tela onde você dá ao usuário várias formas de fazer a mesma coisa. Para mais informações:
http://docs.oracle.com/javase/tutorial/uiswing/misc/action.html

fwsales

ViniGodoy, agora deu certinho…
Nada de executar métodos de janelas fechadas…Rrsrs…
Muito obrigado pela ajuda de todos…
T+

Criado 6 de janeiro de 2012
Ultima resposta 8 de jan. de 2012
Respostas 10
Participantes 5