InputMap

0 respostas
Bambatera

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);
                }
            }
        }
    }
}
Criado 30 de abril de 2013
Respostas 0
Participantes 1