Ação para Teclas de atalho com key Stroke

Bom noite a todos! Estou entrando agora no mundo da programação java é estou tentando criar uma pequena aplicação java na qual eu queria utilizar tecladas de atalhos.Exemplo F2 - salvar,F3 - editar mais não consigo realizar esse procedimento ate achei alguns exemplos mais não deu certo so consegui fazer com a penas uma teclas.
Aqui esta o exemplo do codigo que eu montei

public void Novo() {

 KeyStroke inserir = KeyStroke.getKeyStroke("F2");

 Action actionListener = new AbstractAction() {  

 public void actionPerformed(ActionEvent actionEvent1) {
 JOptionPane.showMessageDialog(null, "Salvar");
    
 }  
 };
 InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);  
 inputMap.put(inserir, "null");
 rootPane.getActionMap().put("null", actionListener);  
 }
1 curtida

Cara tive essa mesma duvida, a minha era com as teclas de funções, veja esse post:

Abraço!

Muito obrigado vitor vou estar tando uma olhada

Obrigado vitor deu certo o unico problema que fica repetindo os mensagens

cara, tá usando o AWTEvent ?

fiz assim, com uma classe privada dentro da interface,
uma modificação do exemplo desse link:
http://guj.com.br/java/140986-como-acionar-os-botoes-de-uma-calculadora-atraves-do-teclado

//essas duas instancias na  propria interface grafica
    private acaoBotaoFuncao botaoF2 = new acaoBotaoFuncao("F2");
    private acaoBotaoFuncao botaoF4 = new acaoBotaoFuncao("F4");

    //Ações para o botão numérico. Ela simplesmente concatena o número ao final   
    //do texto do visor.  
    private class acaoBotaoFuncao extends AbstractAction {

        private String tecla;

        public acaoBotaoFuncao(String tecla) {
            super(tecla);
            this.tecla = tecla;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            switch (tecla) {
                case "F2":
                    btSalvarActionPerformed(e);
                    break;
                case "F4":
                    btCancelarActionPerformed(e);
                    break;
            }
        }
    }

    private void registrarAcoesDoTeclado(JPanel painel) {
        //Damos um nome para cada ação. Esse nome é útil pois mais de   
        //uma tecla pode ser associada a cada ação, como veremos abaixo  
        ActionMap actionMap = painel.getActionMap();
        actionMap.put("F2", botaoF2);
        actionMap.put("F4", botaoF4);
        painel.setActionMap(actionMap);

        //Pegamos o input map que ocorre sempre que a janela atual está em foco  
        InputMap imap = painel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);

        //Associamos o pressionar das teclas (keystroke) aos eventos.  
        //O nome do KeyStroke pode ser obtido através da classe KeyEvent.   

        //Teclas da parte de cima do teclado.  
        imap.put(KeyStroke.getKeyStroke("F2"), "F2");
        imap.put(KeyStroke.getKeyStroke("F4"), "F4");
    }

e dai chame o metodo:

registrarAcoesDoTeclado(JPanel painel)

no construtor da interface gráfica, passando como argumento o seu painel onde os botoes da funcao se encontram

Boa noite Victor sera que teria como você estar esclarecendo algumas duvidas minhas referente aos seu cogido?

sim cara, vamos lá, quais as duvidas?

Não sei muito bem com funciona o esquema do
KeyStroke.getKeyStroke(), gostaria de saber tambem o que faz o getActionMap();
e o InputMap imap = painel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);.
Veja se eu estou correto na minha interpretação.

Essa linha
InputMap imap = painel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
Serve para tirar o foco de qualquer objeto assim que eu precionar algum tecla

E o comando KeyStroke.getKeyStroke(), ele esta meio que associando a tecla ao evento, evento esse que eu indicaria ne

ok vamos lá!

segundo documentacao do JAVA 7 disponivel em:

http://docs.oracle.com/javase/7/docs/api/

o InputMap funciona assim:

InputMap fornece uma ligação entre um evento de entrada (atualmente apenas o teclado são usados) e um objeto. InputMaps são normalmente usados ​​com um ActionMap, para determinar uma ação para executar quando uma tecla é pressionada. Um InputMap pode ter um pai que é procurado não ligações definidas no InputMap.

na prática seria assim, um JPanel tem um InputMap, que controla os eventos dos dispositivos de entrada para ele,
esse inputMap trabalha normalmente com um ActionMap que controla os eventos(ações) de cada JPanel

o que o metodo registrarAcoesDoTeclado(JPanel painel) é pegar o map de ações do jPanel e registrar duas acoes para os botoes, no caso ali,
“F2” e “F4” para os botoes instanciados na parte de cima do código,

depois ele pega o inputMap do Jpanel e atraves do keyStroke(que obtem as teclas pressionadas do teclado) registra duas ações de entrada de cada tecla

é isso, espero ter ajudado!

Abraço!

Curti a explicação valeu muito boa!
agora eu so estou com problema no switch(tecla)
esta dando erro falando q não é compativel

Posta o código ai cara, vamos analizar juntos! :smiley:

Então a principio eu quero fazer aparecer uma mensagem na dela pra depois eu criar os metodos da uma olhada fazendo o favor no codigo fonte aqui esta:

private acaoBotaoFuncao botaoF2 = new acaoBotaoFuncao("F2");
private acaoBotaoFuncao botaoF3 = new acaoBotaoFuncao("F3");
private acaoBotaoFuncao botaoF4 = new acaoBotaoFuncao("F4");
private acaoBotaoFuncao botaoF5 = new acaoBotaoFuncao("F5");
private acaoBotaoFuncao botaoF6 = new acaoBotaoFuncao("F6");

private class acaoBotaoFuncao extends AbstractAction{
    
    private String tecla;

    public acaoBotaoFuncao(String tecla) {
        super(tecla);
        this.tecla = tecla;
       
    }


public void actionPerformed(ActionEvent e) {
        
        switch(tecla){
            case "F2":
            {
                JOptionPane.showMessageDialog(null, "Inserir");
                break;
            }
            case "F3":
            {
                JOptionPane.showMessageDialog(null, "Deletar");
                break;
            }
            case "F4":
            {
                JOptionPane.showMessageDialog(null, "Alterar");
                break;
            }
            case "F5":
            {
                JOptionPane.showMessageDialog(null, "Gravar");
                break;
            }
             case "F6":
            {
                JOptionPane.showMessageDialog(null, "Cancelar");
                break;
            }
        }
       
    
}

}

            private void registrarAcoesDoTeclado(JPanel painel){

             ActionMap actionmap = painel.getActionMap();
             actionmap.put("F2",botaoF2);
             actionmap.put("F3",botaoF3);
             actionmap.put("F4",botaoF4);
             actionmap.put("F5",botaoF5);
             actionmap.put("F3",botaoF3);
             painel.setActionMap(actionmap);

             inputmap.put(KeyStroke.getKeyStroke("F2"),"F2");
             inputmap.put(KeyStroke.getKeyStroke("F3"),"F3");
             inputmap.put(KeyStroke.getKeyStroke("F4"),"F4");
             inputmap.put(KeyStroke.getKeyStroke("F5"),"F5");
             inputmap.put(KeyStroke.getKeyStroke("F6"),"F6");

}

ai eu coloquei no construtor o metodo igual vc me falou
registrarAcoesDoTeclado(jPanel1);

mais esta dando um erro no switch referente a não suportar o valor algo do tipo
obrigado pela ajudar que você esta me dando

cara, é o seguinte, a tua notação do switch-case está errada ai

private acaoBotaoFuncao botaoF2 = new acaoBotaoFuncao("F2"); 
private acaoBotaoFuncao botaoF3 = new acaoBotaoFuncao("F3"); 
private acaoBotaoFuncao botaoF4 = new acaoBotaoFuncao("F4"); 
private acaoBotaoFuncao botaoF5 = new acaoBotaoFuncao("F5"); 
private acaoBotaoFuncao botaoF6 = new acaoBotaoFuncao("F6"); 

private class acaoBotaoFuncao extends AbstractAction{ 

private String tecla; 

public acaoBotaoFuncao(String tecla) { 
super(tecla); 
this.tecla = tecla; 

} 


public void actionPerformed(ActionEvent e) { 

switch(tecla){ 
case "F2": 
{ 
JOptionPane.showMessageDialog(null, "Inserir"); 
break; 
} 
case "F3": 
{ 
JOptionPane.showMessageDialog(null, "Deletar"); 
break; 
} 
case "F4": 
{ 
JOptionPane.showMessageDialog(null, "Alterar"); 
break; 
} 
case "F5": 
{ 
JOptionPane.showMessageDialog(null, "Gravar"); 
break; 
} 
case "F6": 
{ 
JOptionPane.showMessageDialog(null, "Cancelar"); 
break; 
} 
} 


} 
} 

não use as chaves entre um CASE e outro,

use assim:

private acaoBotaoFuncao botaoF2 = new acaoBotaoFuncao("F2"); 
private acaoBotaoFuncao botaoF3 = new acaoBotaoFuncao("F3"); 
private acaoBotaoFuncao botaoF4 = new acaoBotaoFuncao("F4"); 
private acaoBotaoFuncao botaoF5 = new acaoBotaoFuncao("F5"); 
private acaoBotaoFuncao botaoF6 = new acaoBotaoFuncao("F6"); 

private class acaoBotaoFuncao extends AbstractAction{ 

private String tecla; 

public acaoBotaoFuncao(String tecla) { 
super(tecla); 
this.tecla = tecla; 

} 


public void actionPerformed(ActionEvent e) { 

switch(tecla){ 
case "F2": 
JOptionPane.showMessageDialog(null, "Inserir"); 
break; 

case "F3": 
JOptionPane.showMessageDialog(null, "Deletar"); 
break; 

case "F4": 
JOptionPane.showMessageDialog(null, "Alterar"); 
break; 

case "F5": 
JOptionPane.showMessageDialog(null, "Gravar"); 
break; 

case "F6": 
JOptionPane.showMessageDialog(null, "Cancelar"); 
break; 
 } 
 
} 

private void registrarAcoesDoTeclado(JPanel painel){ 

ActionMap actionmap = painel.getActionMap(); 
actionmap.put("F2",botaoF2); 
actionmap.put("F3",botaoF3); 
actionmap.put("F4",botaoF4); 
actionmap.put("F5",botaoF5); 
actionmap.put("F3",botaoF3); 
painel.setActionMap(actionmap); 

inputmap.put(KeyStroke.getKeyStroke("F2"),"F2"); 
inputmap.put(KeyStroke.getKeyStroke("F3"),"F3"); 
inputmap.put(KeyStroke.getKeyStroke("F4"),"F4"); 
inputmap.put(KeyStroke.getKeyStroke("F5"),"F5"); 
inputmap.put(KeyStroke.getKeyStroke("F6"),"F6"); 
 } 
}

A principio esse foi o unico erro que eu vi no seu codigo,
provavelmente assim vai dar certo, caso nao de certo, tente depurar e ver em qual linha o erro ocorre,
e poste ai que vemos juntos

precisando tamos ai :smiley:
Abraço

Então vitor eu arrumei o switch-case mais ainda continua o erro
olha o codigo ai.

//essas duas instancias na propria interface grafica
private acaoBotaoFuncao botaoF2 = new acaoBotaoFuncao(“F2”);
private acaoBotaoFuncao botaoF3 = new acaoBotaoFuncao(“F3”);
private acaoBotaoFuncao botaoF4 = new acaoBotaoFuncao(“F4”);
private acaoBotaoFuncao botaoF5 = new acaoBotaoFuncao(“F5”);
private acaoBotaoFuncao botaoF6 = new acaoBotaoFuncao(“F6”);

private class acaoBotaoFuncao extends AbstractAction{

    private String tecla;

    public acaoBotaoFuncao(String tecla) {
        super(tecla);
        this.tecla = tecla;
       
    }

    /**
     * ActionPerformed e chamado quando ocorre ação
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        
        switch(tecla){
            case "F2":
                JOptionPane.showMessageDialog(null, "Inserir");
                break;
            
            case "F3":
                JOptionPane.showMessageDialog(null, "Deletar");
                break;
            
            case "F4":
                JOptionPane.showMessageDialog(null, "Alterar");
                break;
            case "F5":
                JOptionPane.showMessageDialog(null, "Gravar");
                break;
            case "F6":
                JOptionPane.showMessageDialog(null, "Cancelar");
                break;
        }
       
    
}
} 

private void registrarAcoesDoTeclado(JPanel painel){

ActionMap actionmap = painel.getActionMap();

actionmap.put(“F2”,botaoF2);
actionmap.put(“F3”,botaoF3);
actionmap.put(“F4”,botaoF4);
actionmap.put(“F5”,botaoF5);
actionmap.put(“F6”,botaoF6);
painel.setActionMap(actionmap);

     //Pegamos o input map que ocorre sempre que a janela atual está em foco     
    InputMap inputmap = painel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
    
    //Associamos o pressionar das teclas (keystroke) aos eventos.     
    //O nome do KeyStroke pode ser obtido através da classe KeyEvent.     

    //Teclas da parte de cima do teclado.     

    inputmap.put(KeyStroke.getKeyStroke("F2"),"F2");
    inputmap.put(KeyStroke.getKeyStroke("F3"),"F3");
    inputmap.put(KeyStroke.getKeyStroke("F4"),"F4");
    inputmap.put(KeyStroke.getKeyStroke("F5"),"F5");
    inputmap.put(KeyStroke.getKeyStroke("F6"),"F6");
    
}

aqui esta o codigo
o erro que esta dando no switch-case esta aparecendo isso:
strings in switch are not supported in source - 1.6
(use -source 7 or higher to enable strings in switch)

Obrigado victor pela ajuda deu certo o problema que estava gerando no switch era a versão do jk que eu estava usando o jdk6 e no jdk6 não permite switch com string e no jdk7 ja permite valeu :slight_smile:

verdade!
realmente tinha esquecido desse detalhe,

estamos ai pra ajudar :slight_smile:

Abraço!

Boa tarde estou com outro problema sera que você poderia me ajudar?

posso sim, qual o problema?

Agora estou com problema com jtable não consigo passar os dados do meu banco de dados para o jtable
você por acaso tem alguma exemplo ai pra eu tentar fazer aqui

cara pra povoar uma jtable é mais ou menos assim

    //obtendo o model da tabela
    DefaultTableModel model = (DefaultTableModel) tbParcelas.getModel();
        //limpando o model
        model.getDataVector().clear();
         //for para add as linhas da tabela (vc vai percorrer uma lista
        for (Conta c : parcelas) {
            model.addRow(new Object[]{c.getNumeroDocumento(),
                        new SimpleDateFormat("dd/MM/yyyy").format(c.getDataVencimentoConta()), c.getValorTotalConta()});

        }
         //setando o model novamente pra tabela
        tbParcelas.setModel(model);