Galera eu segui este post pra realizar um InputMap http://www.guj.com.br/java/75002-duvida----actionmap-e-inputmap, mas me deparei com um pequeno problema que não estou conseguindo resolver.
Seguinte, conseguir criar o mapeamento de várias teclas, por exemplo quando teclo F2 meu formulário entra em estado de inclusão.
Segue o código da classe:
public class IncluirAction implements Action {
private Object vobjForm;
private BarraControles vbrrControles;
/**
* Construtor da classe de Ação.
*
* @param objFormulario Formulário que possui a Barra de Controles.
* @param barra Barra de Controles do formulário.
*/
public IncluirAction(Object objFormulario, BarraControles barra) {
this.vobjForm = objFormulario;
this.vbrrControles = barra;
}
@Override
public Object getValue(String string) {
return vobjForm;
}
@Override
public void putValue(String string, Object o) {
if (o instanceof JInternalFrame) {
vobjForm = o;
} else {
vobjForm = null;
}
}
@Override
public void setEnabled(boolean bln) {
vbrrControles.setEnabled(bln);
}
@Override
public boolean isEnabled() {
return vbrrControles.isEnabled();
}
@Override
public void addPropertyChangeListener(PropertyChangeListener pl) {
return;
}
@Override
public void removePropertyChangeListener(PropertyChangeListener pl) {
return;
}
@Override
public void actionPerformed(ActionEvent ae) {
if (vobjForm != null && vbrrControles != null) {
if (vobjForm instanceof JFrame || vobjForm instanceof JInternalFrame || vobjForm instanceof JDialog) {
try {
if (vbrrControles.getTipoOperacao() != TipoOperacao.ALTERAR | vbrrControles.getTipoOperacao() != TipoOperacao.INCLUIR) {
Method objMetodo;
objMetodo = vobjForm.getClass().getDeclaredMethod("incluir");
objMetodo.invoke(vobjForm);
}
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException ex) {
Logger log = Logger.getLogger(vobjForm.getClass());
log.error("Erro ao efetuar a ação de incluir.\n" + ex);
}
}
}
}
}
E o código do InputMap:
public static InputMap mapaControles(Object vFormulario, BarraControles vBarra) {
InputMap iMap = null;
ActionMap aMap;
if (vFormulario instanceof JFrame) {
JFrame objFrame = (JFrame) vFormulario;
iMap = objFrame.getRootPane().getInputMap();
iMap.put(KeyStroke.getKeyStroke("F2"), "buttonF2Press");
iMap.put(KeyStroke.getKeyStroke("F12"), "buttonF12Press");
aMap = objFrame.getRootPane().getActionMap();
aMap.put("buttonF2Press", new IncluirAction(vFormulario, vBarra)); //NOVO
aMap.put("buttonF12Press", new GravarAction(vFormulario, vBarra)); //NOVO
} else if (vFormulario instanceof JInternalFrame) {
JInternalFrame objInternalFrame = (JInternalFrame) vFormulario;
iMap = objInternalFrame.getRootPane().getInputMap();
iMap.put(KeyStroke.getKeyStroke("F2"), "buttonF2Press");
iMap.put(KeyStroke.getKeyStroke("F12"), "buttonF12Press");
aMap = objInternalFrame.getRootPane().getActionMap();
aMap.put("buttonF2Press", new IncluirAction(vFormulario, vBarra)); //NOVO
aMap.put("buttonF12Press", new GravarAction(vFormulario, vBarra)); //NOVO
} else if (vFormulario instanceof JDialog) {
JDialog objDialog = (JDialog) vFormulario;
iMap = objDialog.getRootPane().getInputMap();
iMap.put(KeyStroke.getKeyStroke("F2"), "buttonF2Press");
iMap.put(KeyStroke.getKeyStroke("F12"), "buttonF12Press");
aMap = objDialog.getRootPane().getActionMap();
aMap.put("buttonF2Press", new IncluirAction(vFormulario, vBarra)); //NOVO
aMap.put("buttonF12Press", new GravarAction(vFormulario, vBarra)); //NOVO
}
return iMap;
}
O construtor do meu form:
public FrmSistema(ControleSistema vNewControle, EntityManager vNewManager) {
initComponents();
this.pobjControle = vNewControle;
this.pManagerSistema = vNewManager;
brrControles.setFormulario(this);
brrControles.setTipoOperacao(pintTipoOperacao);
habilitaCampos(false);
limpaCampos();
/*
* Bloqueia o uso do TAB no formulário.
*/
Set<AWTKeyStroke> empty = Collections.emptySet();
this.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, empty);
/*
* Habilita o uso das teclas de funções para o formulário.
*/
getRootPane().setInputMap(WHEN_FOCUSED, FuncoesGlobais.mapaControles(this, brrControles));
}
Então, meu problema consistem em que após utilizar a tecla F2 não consigo utilizar nenhuma outra tecla do mapeamento, por exemplo o F12 que utilizo pra gravar as informações do formulário no banco de dados, porém, quando teclo F12 o sistema não faz nada, nem um erro é apresentado. O método funciona pois quando utilizo o botão o sistema grava perfeitamente no banco de dados.
Como posso resolver isso.
PS: Segue o código que utilizo pra classe GravarAction.
public class GravarAction implements Action {
private Object vobjForm;
private BarraControles vbrrControles;
/**
* Construtor da classe de Ação.
*
* @param objFormulario Formulário que possui a Barra de Controles.
* @param barra Barra de Controles do formulário.
*/
public GravarAction(Object objFormulario, BarraControles barra) {
this.vobjForm = objFormulario;
this.vbrrControles = barra;
}
@Override
public Object getValue(String string) {
return vobjForm;
}
@Override
public void putValue(String string, Object o) {
if (o instanceof JInternalFrame) {
vobjForm = o;
} else {
vobjForm = null;
}
}
@Override
public void setEnabled(boolean bln) {
vbrrControles.setEnabled(bln);
}
@Override
public boolean isEnabled() {
return vbrrControles.isEnabled();
}
@Override
public void addPropertyChangeListener(PropertyChangeListener pl) {
return;
}
@Override
public void removePropertyChangeListener(PropertyChangeListener pl) {
return;
}
@Override
public void actionPerformed(ActionEvent ae) {
if (vobjForm != null && vbrrControles != null) {
if (vobjForm instanceof JFrame || vobjForm instanceof JInternalFrame || vobjForm instanceof JDialog) {
try {
if (vbrrControles.getTipoOperacao() == TipoOperacao.ALTERAR || vbrrControles.getTipoOperacao() == TipoOperacao.INCLUIR) {
Method objMetodo;
objMetodo = vobjForm.getClass().getDeclaredMethod("gravar");
objMetodo.invoke(vobjForm);
}
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException ex) {
Logger log = Logger.getLogger(vobjForm.getClass());
log.error("Erro ao efetuar a ação de gravar.\n" + ex);
}
}
}
}
}