Prezados, Bom dia.
Em meu projeto tenho um método que utilizou para através das teclas de atalho F1, F2 e etc…
Eu vi aqui mesmo no GUJ uma pergunta parecida e verifiquei o código e apliquei no meu projeto.
O Problema é que a tecla F1 está funcionando quando eu pressiono, mas quando eu aperto outra tecla F2, não acontece nada, agora percebi que se eu ficar pressionando um monte de teclas ele trava um pouco depois é exibida a ação do F2, é como se em algum lugar a ação ainda estive presa no F1( primeira tecla pressionada)
Segue o meu Código:
public class TelaVendas extends javax.swing.JFrame {
private AcaoBotao botaoF1 = new AcaoBotao(“F1”);
private AcaoBotao botaoF2 = new AcaoBotao(“F2”);
public TelaVendas() {
initComponents();
RegistrarAcaoBotao(jPanel2);
lblQuantidade.setEnabled(false);
txtAlteraQuantidade.setEnabled(false);
//txtAlteraQuantidade.setVisible(false);
}
private class AcaoBotao extends AbstractAction {
private String tecla;
public AcaoBotao(String tecla) {
super(tecla);
this.tecla = tecla;
}
@Override
public void actionPerformed(ActionEvent ae) {
switch (tecla) {
case "F1":
TelaPesquisaVendas telapesq = new TelaPesquisaVendas(TelaVendas.this, true);
telapesq.setVisible(true);
break;
case "F2":
Double desconto, total, calculo;
Double desc = Double.parseDouble(JOptionPane.showInputDialog(null, "Digite a porcentagem de Desconto .: "));
desc = (desc * Double.parseDouble(lblTotal.getText()))/100;
desconto = desc ;
lblDesconto.setText(""+desconto);
total = Double.parseDouble(lblTotal.getText());
calculo = total - desconto;
lblSubTotal.setText(""+calculo);
break;
}
}
}
Esse é o Método que Registra a Ação do Botão:
private void RegistrarAcaoBotao(javax.swing.JPanel panel) {
ActionMap actionmap = panel.getActionMap();
actionmap.put("F1", botaoF1);
actionmap.put("F2", botaoF2);
panel.setActionMap(actionmap);
InputMap inputmap = panel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
inputmap.put(KeyStroke.getKeyStroke("F1"), "F1");
inputmap.put(KeyStroke.getKeyStroke("F2"), "F2");
}
Creio que o ideal seria você criar threads separadas para cada ação.
@darlan_machado
Tipo criar um método RegistraAcaoBotão para cada tecla ?
Ex: RegistraAcaoBotaoF1, RegistraAcaoBotaoF2?
Na hora de inicializar o componente eu chamo os métodos lá?
RegistraBotaoF1();
RegistraBotaoF2();
É isso?
Esse Seria o melhor modo de resolver? Qual o problema do código que descrevi acima?
Porque não está funcionando?
A questão com o código acima é que, ao clicar em um botão, sua ação será executada e, enquanto isso, o sistema todo fica aguardando a execução desta ação.
Se essa ação demorar 10 horas, o sistema todo fica aguardando por 10 horas.
Caso você implemente uma trhead para cada ação definida (ou mesmo apenas para as que vão levar mais tempo), você isola a execução em uma thread separada e pode usar o sistema, que não ficará travado.
O ponto negativo disso é que você não terá uma sequência lógica na execução das tarefas, tendo em vista que uma thread isolada será um processamento assíncrono (ou quase isso).
Se é o melhor jeito de resolver, quem precisa dizer é você. O que você expôs é que o click no botão está lento e travando o sistema todo.
Ou você identifica o gargalo e resolve essa lentidão ou você implementa thread e mantém a lentidão, mas, sem impedir o acesso às demais funcionalidades do sistema.
@darlan_machado, não sou expert no assunto estou iniciando. o aprendizado fica melhor na prática. estou desenvolvendo um sistema com o pouco que conheço e a medida que vou pensando em uma funcionalidade para o sistema eu vou procurar como fazer, logo vejo que outras pessoas tiveram a mesma dúvida e observo a correção, baseado nisso percebo o código e procuro entender a funcionalidade dele.
por isso que perguntei qual o problema do código acima. a questão do travamento como havia explicado era com apenas outro botão F2, pois o F1 funciona normalmente.
Há alguns dias atrás tive problemas com a thread quando estava colocando um tempo para um jframe ficar aberto, então quando eu colocava o thread.sleep(10000); o programa parava até terminar o tempo, então percebi aqui mesmo com a ajuda de @staroski como realizar o procedimento, entre os comentários vi que o próprio frame inicia com uma thread (me corrija se estiver errado), e como eu estava chamando outra thread, uma parava para a outra ser executada. Enfim nesse código acima eu não chamei nenhuma thread, o travamento que eu achava é por causa do switch- case , tipo o break ou outra coisa. Se fosse travamento por thread na primeira tecla pressionada deveria parar (minha opinião não sei se está correta).
Enfim um solução para o problema que aparentemente resolveu foi essa:
public TelaVendas() {
initComponents();
addKeyListener(new LeitorTeclas());
setVisible(true);
setFocusable(true);
lblQuantidade.setEnabled(false);
txtAlteraQuantidade.setEnabled(false);
}
private class LeitorTeclas implements KeyListener
{
@Override
public void keyPressed(KeyEvent arg0)
{
switch(arg0.getKeyCode())
{
case(KeyEvent.VK_F1):
TelaPesquisaVendas telapesq = new TelaPesquisaVendas(TelaVendas.this, true);
telapesq.setVisible(true);
break;
case(KeyEvent.VK_F2):
Double desconto, total, calculo;
Double desc = Double.parseDouble(JOptionPane.showInputDialog(null, "Digite a porcentagem de Desconto .: "));
desc = (desc * Double.parseDouble(lblTotal.getText()))/100;
desconto = desc ;
lblDesconto.setText(""+desconto);
total = Double.parseDouble(lblTotal.getText());
calculo = total - desconto;
lblSubTotal.setText(""+calculo);
break;
}
}
1 curtida
Cara, comece por debugar o código, descobrir onde é o ponto de lentidão.
1 curtida
Prezados, Resolvi o problema de forma paleativa nesse código.
O que estava ocasionando o travamento era o seguinte, para utilizar as teclas é necessário que o Jframe esteja sempre .setVisible e .setFocusable, para que a ação do botão funcione.
Quando eu clicava na linha da tabela, a jTable entrava em foco, impedindo assim das teclas funcionarem.
Então retirei o foco da tabela, creio que é um paliativo não recomendado, como o @darlan_machado falou preciso estudar a thread, para que eu possa fazer com que as ações aconteçam de forma simultânea.