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
Eventos de tecla
10 Respostas
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.
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);
}
});
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.
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!
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);
Graaaaande mauricioadl,
Muito obrigado pela força!!
Resolveu meu problema…
Deu certinhoooo!!
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();
}
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:
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.
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
ViniGodoy, agora deu certinho…
Nada de executar métodos de janelas fechadas…Rrsrs…
Muito obrigado pela ajuda de todos…
T+