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
//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
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
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
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
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;
}
}
}
//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
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
//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);